Skrivet av Giuseppe Broccolo
Sedan PostgreSQL 9.3 är det möjligt att uppdatera och infoga i vyer direkt, så länge vyn hänvisar till endast en underliggande tabell.
PostgreSQL 9.4 tillåter oss att använda CHECK-satsen för INSERTs i uppdateringsbara vyer. Tänk till exempel en tabell som består av bara en heltalskolumn; och överväg två vyer, en på tal som är delbara med 2 och en på siffror som är delbara med 3. Om vi försöker infoga siffran 123 i den första vyn:
—-
$ CREATE TABLE some_data(id int4 PRIMARY KEY);
SKAPA TABELL
$ SKAPA VY först SOM SELECT * FROM some_data WHERE 0 =id%2;
SKAPA VY
$ CREATE VIEW sekund SOM SELECT * FROM some_data WHERE 0 =id%3;
SKAPA VY
$ INSERT INTO first(id) VALUES (123);
—-
Det kommer att infogas i den underliggande tabellen, även om vyn bara är för siffror som är delbara med 2 (så det nya värdet kommer inte att synas i vyn). I PostgreSQL 9.4 har CHECK-satsen införts för att korrekt hantera INSERTs i vyer genom att i förväg kontrollera att värdena är kompatibla med definitionen av vyn.
Det finns två möjliga alternativ:
* CASCADED CHECK – detta är standardalternativet, där kontroller överlappar till andra vyer definierade på samma underliggande tabell
* LOCAL CHECK – endast den vy som är målet för en INSERT kontrolleras
Här visas hur man använder CHECK-satsen i exemplet ovan:
—-
$ SLIP VY först;
DROP VIEW
$ DROP VIEW sekund;
DROP VIEW
$ SKAPA VY först SOM SELECT * FROM some_data WHERE 0 =id % 2 MED KONTROLLVALTNING;
SKAPA VY
$ CREATE VIEW sekund SOM SELECT * FROM some_data WHERE 0 =id % 3 MED KONTROLLVALTNING;
SKAPA VY
$ SKAPA VISNING tredje SOM VÄLJ * FRÅN först WHERE 0 =id % 3 MED KONTROLLALTERNATIV;
SKAPA VY
$ INSERT INTO first(id) VALUES (14);
INFOGA 0 1
$ INSERT INTO first(id) VALUES (15);
FEL: ny rad bryter mot MED KONTROLLOPTION för vy "först"
$ INSERT INTO second(id) VALUES (15);
INFOGA 0 1
$ INSERT INTO third(id) VALUES (6);
INFOGA 0 1
$ INSERT INTO third(id) VALUES (15);
FEL: ny rad bryter mot MED KONTROLLOPTION för vy "först"
Observera att vyn "tredje" definieras i vyn "först".
Värdet '14' är korrekt infogat i den första vyn, medan värdet '15' bara kan infogas i andra, inte första - som förväntat. Vi kan infoga "6" i den tredje vyn eftersom den är delbar med både 3 och 2. Felet med att infoga "15" i den tredje vyn trots att den är delbar med 3 beror på att den bryter mot delbart-med-2 CHECK-satsen på föräldrasynen, först. I det här fallet är det inte tillräckligt att använda en LOCAL CHECK-klausul i båda vyerna för att komma runt problemet:
—-
$ SLIP VY först;
DROP VIEW
$ DROP VIEW tredje;
DROP VIEW
$ SKAPA VY först SOM SELECT * FROM some_data WHERE 0 =id % 2 MED LOKAL KONTROLLALTERNATIV;
SKAPA VY
$ SKAPA VISNING tredje SOM VÄLJ * FRÅN först WHERE 0 =id % 3 MED LOKALT KONTROLLALTERNATIV;
SKAPA VY
$ INSERT INTO third(id) VALUES (15);
FEL: ny rad bryter mot MED KONTROLLOPTION för vy "först"
—-
Arbetsexemplet visas här:
—-
$ SLIP VY först;
DROP VIEW
$ DROP VIEW tredje;
DROP VIEW
$ SKAPA VY först SOM SELECT * FROM some_data WHERE 0 =id % 2;
SKAPA VY
$ SKAPA VISNING tredje SOM VÄLJ * FRÅN först WHERE 0 =id % 3 MED LOKALT KONTROLLALTERNATIV;
SKAPA VY
$ INSERT INTO third(id) VALUES (15);
INFOGA 0 1
—-
Slutsatser
Denna nya kontrollmekanism kan appliceras direkt på uppdateringsbara vyer under INSERT-fasen. Det förstärker mer och mer databasens roll för att upprätthålla dataintegriteten.