PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

La clause CHECK pour les vues pouvant être mises à jour

Écrit par Giuseppe Broccolo 

Depuis PostgreSQL 9.3, il est possible de mettre à jour et d'insérer directement dans les vues, tant que la vue fait référence à une seule table sous-jacente.

PostgreSQL 9.4 nous permet d'utiliser la clause CHECK pour les INSERT dans les vues pouvant être mises à jour. Par exemple, considérons une table composée d'une seule colonne d'entiers ; et considérons deux vues, une sur les nombres divisibles par 2 et une sur les nombres divisibles par 3. Si nous essayons d'insérer le nombre 123 dans la première vue :

—-

$ CREATE TABLE some_data(id int4 PRIMARY KEY);

CRÉER UN TABLEAU

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

CRÉER UNE VUE

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

CRÉER UNE VUE

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

—-

Elle sera insérée dans la table sous-jacente, même si la vue ne concerne que les nombres divisibles par 2 (la nouvelle valeur ne sera donc pas visible dans la vue). Dans PostgreSQL 9.4, la clause CHECK a été introduite pour gérer correctement les INSERT dans les vues en vérifiant à l'avance que les valeurs sont compatibles avec la définition de la vue.

Il y a deux options possibles :

* VÉRIFICATION EN CASCADE - il s'agit de l'option par défaut, où les vérifications se répercutent sur d'autres vues définies sur la même table sous-jacente

* LOCAL CHECK - seule la vue qui est la cible d'un INSERT est vérifiée

Ici, il est montré comment utiliser la clause CHECK dans l'exemple ci-dessus :

—-

$ DÉPOSER LA VUE en premier ;

VUE DÉPOSÉE

$ DROP VIEW seconde ;

VUE DÉPOSÉE

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

CRÉER UNE VUE

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

CRÉER UNE VUE

$ CREATE VIEW troisième AS SELECT * FROM premier WHERE 0 =id % 3 WITH CHECK OPTION;

CRÉER UNE VUE

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

INSÉRER 0 1

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

ERREUR : la nouvelle ligne ne respecte pas l'option WITH CHECK OPTION pour l'affichage "first"

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

INSÉRER 0 1

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

INSÉRER 0 1

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

ERREUR : la nouvelle ligne ne respecte pas l'option WITH CHECK OPTION pour l'affichage "first"

Notez que la vue "troisième" est définie sur la vue "première".

La valeur '14' est correctement insérée dans la première vue, tandis que la valeur '15' ne peut être insérée que dans la seconde, pas la première - comme prévu. Nous pouvons insérer '6' dans la troisième vue car elle est divisible à la fois par 3 et 2. L'erreur concernant l'insertion de '15' dans la troisième vue même si elle est divisible par 3 est due au fait qu'elle viole la clause CHECK divisible par 2 sur la vue parent, d'abord. Dans ce cas, il ne suffit pas d'utiliser une clause LOCAL CHECK dans les deux vues pour contourner le problème :

—-

$ DÉPOSER LA VUE en premier ;

VUE DÉPOSÉE

$ DROP VIEW troisième ;

VUE DÉPOSÉE

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

CRÉER UNE VUE

$ CREATE VIEW troisième AS SELECT * FROM premier WHERE 0 =id % 3 WITH LOCAL CHECK OPTION ;

CRÉER UNE VUE

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

ERREUR : la nouvelle ligne ne respecte pas l'option WITH CHECK OPTION pour l'affichage "first"

—-

L'exemple de travail est montré ici :

—-

$ DÉPOSER LA VUE en premier ;

VUE DÉPOSÉE

$ DROP VIEW troisième ;

VUE DÉPOSÉE

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

CRÉER UNE VUE

$ CREATE VIEW troisième AS SELECT * FROM premier WHERE 0 =id % 3 WITH LOCAL CHECK OPTION ;

CRÉER UNE VUE

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

INSÉRER 0 1

—-

Conclusion

Ce nouveau mécanisme de contrôle peut être appliqué directement sur les vues modifiables lors de la phase INSERT. Cela renforce de plus en plus le rôle de la base de données dans le maintien de l'intégrité des données.