Napsal Giuseppe Broccolo
Od PostgreSQL 9.3 je možné aktualizovat a vkládat do pohledů přímo, pokud pohled odkazuje pouze na jednu podkladovou tabulku.
PostgreSQL 9.4 nám umožňuje používat klauzuli CHECK pro INSERTy do aktualizovatelných pohledů. Uvažujme například tabulku složenou pouze z jednoho celočíselného sloupce; a uvažujme dva pohledy, jeden na čísla dělitelná 2 a jeden na čísla dělitelná 3. Pokud se pokusíme vložit číslo 123 do prvního pohledu:
—-
$ CREATE TABLE some_data(id int4 PRIMARY KEY);
VYTVOŘIT TABULKU
$ CREATE VIEW first AS SELECT * FROM some_data WHERE 0 =id%2;
VYTVOŘIT ZOBRAZENÍ
$ CREATE VIEW second AS SELECT * FROM some_data WHERE 0 =id%3;
VYTVOŘIT ZOBRAZENÍ
$ INSERT INTO first(id) VALUES (123);
—-
Vloží se do podkladové tabulky, i když je zobrazení pouze pro čísla dělitelná 2 (takže nová hodnota nebude v zobrazení vidět). V PostgreSQL 9.4 byla zavedena klauzule CHECK pro správnou správu INSERTů do pohledů tím, že se předem zkontroluje, že hodnoty jsou kompatibilní s definicí pohledu.
Existují dvě možné možnosti:
* KASKÁDOVÁ KONTROLA – toto je výchozí možnost, kdy kontroly kaskádovitě postupují do jiných pohledů definovaných ve stejné podkladové tabulce
* LOCAL CHECK – kontroluje se pouze pohled, který je cílem INSERT
Zde je ukázáno, jak použít klauzuli CHECK ve výše uvedeném příkladu:
—-
$ Nejprve DROP VIEW;
ZOBRAZENÍ POHLEDEM
$ DROP VIEW sekundu;
ZOBRAZENÍ POHLEDEM
$ CREATE VIEW first AS SELECT * FROM some_data WHERE 0 =id % 2 WITH CHECK OPTION;
VYTVOŘIT ZOBRAZENÍ
$ CREATE VIEW second AS SELECT * FROM some_data WHERE 0 =id % 3 WITH CHECK OPTION;
VYTVOŘIT ZOBRAZENÍ
$ CREATE VIEW third AS SELECT * FROM first WHERE 0 =id % 3 WITH CHECK OPTION;
VYTVOŘIT ZOBRAZENÍ
$ INSERT INTO first(id) VALUES (14);
INSERT 0 1
$ INSERT INTO first(id) VALUES (15);
CHYBA: nový řádek porušuje WITH CHECK OPTION pro zobrazení „první“
$ INSERT INTO second(id) VALUES (15);
INSERT 0 1
$ INSERT INTO third(id) VALUES (6);
INSERT 0 1
$ INSERT INTO third(id) VALUES (15);
CHYBA: nový řádek porušuje WITH CHECK OPTION pro zobrazení „první“
Všimněte si, že pohled „třetí“ je definován na pohledu „první“.
Hodnota „14“ je správně vložena do prvního pohledu, zatímco hodnota „15“ může být vložena pouze do druhého, nikoli prvního – jak se očekávalo. Do třetího pohledu můžeme vložit '6', protože je dělitelné 3 i 2. Chyba při vkládání '15' do třetího pohledu, i když je dělitelné 3, je proto, že porušuje klauzuli dělitelné 2 CHECK nejprve na rodičovském pohledu. V tomto případě k vyřešení problému nestačí použít klauzuli LOCAL CHECK v obou pohledech:
—-
$ Nejprve DROP VIEW;
ZOBRAZENÍ POHLEDEM
$ DROP VIEW třetí;
ZOBRAZENÍ POHLEDEM
$ CREATE VIEW first AS SELECT * FROM some_data WHERE 0 =id % 2 S MOŽNOSTÍ MÍSTNÍ KONTROLY;
VYTVOŘIT ZOBRAZENÍ
$ CREATE VIEW třetí JAKO VÝBĚR * OD prvního KDE 0 =id % 3 S MOŽNOSTÍ MÍSTNÍ KONTROLY;
VYTVOŘIT ZOBRAZENÍ
$ INSERT INTO third(id) VALUES (15);
CHYBA: nový řádek porušuje WITH CHECK OPTION pro zobrazení „první“
—-
Pracovní příklad je uveden zde:
—-
$ Nejprve DROP VIEW;
ZOBRAZENÍ POHLEDEM
$ DROP VIEW třetí;
ZOBRAZENÍ POHLEDU
$ CREATE VIEW first AS SELECT * FROM some_data WHERE 0 =id % 2;
VYTVOŘIT ZOBRAZENÍ
$ CREATE VIEW třetí JAKO VÝBĚR * OD prvního KDE 0 =id % 3 S MOŽNOSTÍ MÍSTNÍ KONTROLY;
VYTVOŘIT ZOBRAZENÍ
$ INSERT INTO third(id) VALUES (15);
INSERT 0 1
—-
Závěry
Tento nový kontrolní mechanismus lze použít přímo na aktualizovatelné pohledy během fáze INSERT. Stále více posiluje roli databáze při udržování integrity dat.