PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Die CHECK-Klausel für aktualisierbare Sichten

Geschrieben von Giuseppe Broccolo 

Seit PostgreSQL 9.3 ist es möglich, Ansichten direkt zu aktualisieren und einzufügen, solange sich die Ansicht nur auf eine zugrunde liegende Tabelle bezieht.

PostgreSQL 9.4 ermöglicht es uns, die CHECK-Klausel für INSERTs in aktualisierbare Ansichten zu verwenden. Stellen Sie sich beispielsweise eine Tabelle vor, die nur aus einer ganzzahligen Spalte besteht. und betrachten Sie zwei Ansichten, eine auf Zahlen, die durch 2 teilbar sind, und eine auf Zahlen, die durch 3 teilbar sind. Wenn wir versuchen, die Zahl 123 in die erste Ansicht einzufügen:

—-

$ CREATE TABLE some_data(id int4 PRIMARY KEY);

TABELLE ERSTELLEN

$ CREATE VIEW first AS SELECT * FROM some_data WHERE 0 =id%2;

ANSICHT ERSTELLEN

$ CREATE VIEW second AS SELECT * FROM some_data WHERE 0 =id%3;

ANSICHT ERSTELLEN

$ INSERT INTO first(id) VALUES (123);

—-

Er wird in die zugrunde liegende Tabelle eingefügt, obwohl die Ansicht nur für Zahlen gilt, die durch 2 teilbar sind (der neue Wert wird also in der Ansicht nicht sichtbar sein). In PostgreSQL 9.4 wurde die CHECK-Klausel eingeführt, um INSERTs in Ansichten richtig zu verwalten, indem im Voraus überprüft wird, ob Werte mit der Definition der Ansicht kompatibel sind.

Es gibt zwei mögliche Optionen:

* CASCADED CHECK – dies ist die Standardoption, bei der Prüfungen zu anderen Ansichten kaskadieren, die auf derselben zugrunde liegenden Tabelle definiert sind

* LOCAL CHECK – nur die Ansicht, die das Ziel eines INSERT ist, wird geprüft

Hier wird gezeigt, wie die CHECK-Klausel im obigen Beispiel verwendet wird:

—-

$ DROP VIEW zuerst;

DROP-ANSICHT

$ DROP VIEW Sekunde;

DROP-ANSICHT

$ CREATE VIEW first AS SELECT * FROM some_data WHERE 0 =id % 2 WITH CHECK OPTION;

ANSICHT ERSTELLEN

$ CREATE VIEW second AS SELECT * FROM some_data WHERE 0 =id % 3 WITH CHECK OPTION;

ANSICHT ERSTELLEN

$ CREATE VIEW Third AS SELECT * FROM first WHERE 0 =ID % 3 WITH CHECK OPTION;

ANSICHT ERSTELLEN

$ INSERT INTO first(id) VALUES (14);

0 1 EINFÜGEN

$ INSERT INTO first(id) VALUES (15);

FEHLER:  Neue Zeile verstößt gegen WITH CHECK OPTION für Ansicht „zuerst“

$ INSERT INTO second(id) VALUES (15);

0 1 EINFÜGEN

$ INSERT INTO Third(id) VALUES (6);

0 1 EINFÜGEN

$ INSERT INTO Third(id) VALUES (15);

FEHLER:  Neue Zeile verstößt gegen WITH CHECK OPTION für Ansicht „zuerst“

Beachten Sie, dass die Ansicht „dritte“ auf der Ansicht „erste“ definiert ist.

Der Wert „14“ wird korrekt in die erste Ansicht eingefügt, während der Wert „15“ nur in die zweite eingefügt werden kann, nicht in die erste – wie erwartet. Wir können „6“ in die dritte Ansicht einfügen, weil sie sowohl durch 3 als auch durch 2 teilbar ist. Der Fehler beim Einfügen von „15“ in die dritte Ansicht, obwohl sie durch 3 teilbar ist, liegt daran, dass dies gegen die durch 2 teilbare CHECK-Klausel verstößt zuerst in der übergeordneten Ansicht. In diesem Fall reicht es nicht aus, in beiden Ansichten eine LOCAL CHECK-Klausel zu verwenden, um das Problem zu umgehen:

—-

$ DROP VIEW zuerst;

DROP-ANSICHT

$ DROP VIEW drittes;

DROP-ANSICHT

$ CREATE VIEW first AS SELECT * FROM some_data WHERE 0 =id % 2 WITH LOCAL CHECK OPTION;

ANSICHT ERSTELLEN

$ CREATE VIEW Third AS SELECT * FROM first WHERE 0 =ID % 3 WITH LOCAL CHECK OPTION;

ANSICHT ERSTELLEN

$ INSERT INTO Third(id) VALUES (15);

FEHLER:  Neue Zeile verstößt gegen WITH CHECK OPTION für Ansicht „zuerst“

—-

Das Arbeitsbeispiel wird hier gezeigt:

—-

$ DROP VIEW zuerst;

DROP-ANSICHT

$ DROP VIEW drittes;

DROP-ANSICHT

$ CREATE VIEW first AS SELECT * FROM some_data WHERE 0 =id % 2;

ANSICHT ERSTELLEN

$ CREATE VIEW Third AS SELECT * FROM first WHERE 0 =ID % 3 WITH LOCAL CHECK OPTION;

ANSICHT ERSTELLEN

$ INSERT INTO Third(id) VALUES (15);

0 1 EINFÜGEN

—-

Schlussfolgerungen

Dieser neue Prüfmechanismus kann während der INSERT-Phase direkt auf aktualisierbare Views angewendet werden. Es verstärkt immer mehr die Rolle der Datenbank bei der Wahrung der Datenintegrität.