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.