CREATE VIEW în PostgreSQL

Tabele, scheme și tipuri (DDL) PostgreSQL 8.0+ (view-uri actualizabile: 9.3+, WITH CHECK OPTION: 9.4+)

Salvează o interogare sub un nume, ca s-o folosești ca pe un tabel. Datele nu se copiază: interogarea rulează la fiecare citire.

Sintaxă SQL
CREATE [OR REPLACE] VIEW nume [(coloane)] AS
    interogare
    [WITH [CASCADED | LOCAL] CHECK OPTION];

Ce face CREATE VIEW

Un view este o interogare cu nume. SELECT * FROM clienti_activi rulează de fiecare dată interogarea din spatele view-ului, deci vezi mereu datele actuale. View-urile ascund JOIN-uri complicate și pot expune doar anumite coloane unui utilizator.

View-urile simple (un singur tabel, fără GROUP BY, DISTINCT, agregări) se pot și modifica: INSERT, UPDATE și DELETE pe view ajung în tabelul de bază. Cu WITH CHECK OPTION, PostgreSQL refuză modificările care ar scoate rândul din view.

CREATE OR REPLACE VIEW poate schimba interogarea, dar coloanele existente trebuie să rămână cu același nume și tip, în aceeași ordine; poți doar adăuga coloane noi la final.

Parametri

Parametru Descriere
OR REPLACE Înlocuiește un view existent cu același nume.
AS interogare Un SELECT.
WITH CHECK OPTION Refuză INSERT/UPDATE prin view pentru rânduri care nu respectă WHERE-ul view-ului.

Ce returnează

Mesajul CREATE VIEW.

Exemple

Exemplul 1: View pentru un raport folosit des

CREATE VIEW comenzi_detaliate AS
SELECT c.id, cl.nume AS client, cl.oras, c.total
FROM comenzi c
JOIN clienti cl ON cl.id = c.client_id;

SELECT client, oras, total FROM comenzi_detaliate WHERE oras = 'Iași';

Rezultat în psql

CREATE VIEW
 client | oras | total  
--------+------+--------
 Ana    | Iași | 149.90
 Ioana  | Iași |  89.00
(2 rows)

Exemplul 2: View actualizabil cu WITH CHECK OPTION

Tabelul clienti are aici doar coloanele id, nume și oras. Modificarea care mută clientul în alt oraș l-ar scoate din view, deci este refuzată.

CREATE VIEW clienti_iasi AS
SELECT id, nume, oras FROM clienti WHERE oras = 'Iași'
WITH CHECK OPTION;

UPDATE clienti_iasi SET nume = 'Ana Popescu' WHERE id = 1;
UPDATE clienti_iasi SET oras = 'Cluj' WHERE id = 1;

Rezultat în psql

CREATE VIEW
UPDATE 1
ERROR:  new row violates check option for view "clienti_iasi"
DETAIL:  Failing row contains (1, Ana Popescu, Cluj).

Greșeli frecvente

  • Crezi că un view face interogarea mai rapidă. Un view obișnuit nu stochează nimic; pentru rezultate precalculate folosește un view materializat.
  • Folosești SELECT * în definiția view-ului și apoi adaugi coloane în tabel: view-ul păstrează lista de coloane de la creare și nu le vede pe cele noi.

Comenzi înrudite

  • CREATE MATERIALIZED VIEW și REFRESH: View care salvează rezultatul interogării pe disc. Citirea este rapidă, iar datele se actualizează doar când rulezi REFRESH.
  • CREATE TABLE AS și LIKE: Creează un tabel din rezultatul unei interogări (CREATE TABLE AS) sau copiind structura altui tabel (LIKE).
  • GRANT și ALTER DEFAULT PRIVILEGES: Dă unui rol drepturi pe o bază de date, o schemă, tabele sau secvențe. ALTER DEFAULT PRIVILEGES le dă automat și pe tabelele create ulterior.