sql >> Databasteknik >  >> RDS >> PostgreSQL

CHECK-klausulen för uppdateringsbara vyer

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.


  1. Lagrad procedur för att få information om databastabeller

  2. Hur kontrollerar jag om radioknappen är markerad eller vald i jQuery?

  3. Tips för att använda SQL Server med Salesforce

  4. Flera rangordnar i en tabell