CREATE RULE

Nom

CREATE RULE — Definit une nouvelle règle.
CREATE RULE name AS ON event
    TO object [ WHERE condition ]
    DO [ INSTEAD ] [ action | NOTHING ]
  

Entrées

name

nom de la règle a créer.

event

Event fait partie de select, update, delete ou insert.

object

Object est ou table ou tablecolumn.

condition

Certaines clauses SQL WHERE new ou current peuvent apparaître comme une variable instance chaque fois qu'une variable instance est permise en SQL.

action

Certaines clauses SQL new ou current peuvent apparaître comme une variable instance chaque fois qu'une variable instance est permise en SQL.

Sorties

CREATE

message retourné si la règle a été créée correctement.

Description

Les sémantiques d'une règle font que au moment où une instance individuelle est accédée, mise à jour, insérée ou supprimée, il y a une instance courante (pour retrouver, mettre à jour et supprimer) et une nouvelle instance (pour mettre à jour et ajouter). Si event spécifié dans la clause ON et le condition spécifié dans la clause WHERE sont vrais pour l'instance courante, la partie action de la règle est exécutée. En premier, cependant, les valeurs des champs dans l'instance courante et/ou la nouvelle instance sont substituées en current.attribute-name and new.attribute-name.

La partie action de la règle s'exécute avec la même commande et l'identifiant de transaction que la commande utiliateur qui cause l'activation.

Notes

Avertissement sur les règles SQL. Si le même nom de classe ou de variable d'instance apparait dans event, les parties condition et action d'une règle sont toutes considérées comme variables tuple différentes. new et current sont les seules variables tuple qui sont partagées entre ces clauses. Par exemple, les deux règles suivantes ont la même sémantique :
ON UPDATE TO emp.salary WHERE emp.name = "Joe"
    DO UPDATE emp ( ... ) WHERE ...
    
ON UPDATE TO emp-1.salary WHERE emp-2.name = "Joe"
    DO UPDATE emp-3 ( ... ) WHERE ...
    
Chaque règle peut avoir une balise optionnelle INSTEAD Sans cette balise, action sera exécutée en plus de la commande utilisateur quand le event dans la partie condition de la règle se produit. Alternativement, la partie action sera exécutée au lieu de la commande utilisateur. Dans ce dernier cas, action peut être le mot-clé NOTHING.

Quand vous choisissez entre la réécriture et les règles d'instance système pour une règle particulière, souvenez vous que dans le système de réécriture, current se réfère à une relation et quelques qualifiers attendu que dans le system instance il se réfère à une instance (tuple).

Il est très important de noter que le système de réécriture de règles ne sera pas détecté et ne traitera pas les règles qui font des références circulaires. Par exemple, quoique chacune des deux définitions de règles suivantes sont acceptées par Postgres, la commande retrieve provoquera un crash de Postgres :

Exemple 14-1. Exemple de circular rewrite rule combination.

CREATE RULE bad_rule_combination_1 AS
    ON SELECT TO emp
    DO INSTEAD SELECT TO toyemp;
     
CREATE RULE bad_rule_combination_2 AS
    ON SELECT TO toyemp
    DO INSTEAD SELECT TO emp;
     

Cette tentative de retrieve depuis EMP causera un crash Postgres.
SELECT * FROM emp;
      

Vous devez avoir les droits de définition de règles vers une classe afin de définir une règle sur celle-ci. Utilisez GRANT et REVOKE pour changer les permissions.

Utilisation

Faire que Sam ait le même ajustement de salaire que Joe :
CREATE RULE example_1 AS
    ON UPDATE emp.salary WHERE current.name = "Joe"
    DO UPDATE emp (salary = new.salary)
    WHERE emp.name = "Sam";
   
À ce moment Joe reçoit un ajustement de salaire, le cas devient vrai et la l'instance courante de Joe et les nouvelles instances proposées sont disponibles pour les routines d'exécution. Désormais, son nouveau salaire est substitué dans la partie action de la règle qui est subséquemment exécutée.

Faire que Bill obtienne le même salaire que Joe quand il est accédé :
CREATE RULE example_2 AS
    ON SELECT TO EMP.salary
    WHERE current.name = "Bill"
    DO INSTEAD
    SELECT (emp.salary) from emp
        WHERE emp.name = "Joe";
   

Refuser à Joe d'accéder au salaire des employés du département chaussure (current_user retourne le nom de l'utilisateur courant) :
  
CREATE RULE example_3 AS
    ON SELECT TO emp.salary
    WHERE current.dept = "shoe" AND current_user = "Joe"
    DO INSTEAD NOTHING;
   

Créer un vue des employés travaillant dans le département jouet :
CREATE toyemp(name = char16, salary = int4);

CREATE RULE example_4 AS
    ON SELECT TO toyemp
    DO INSTEAD
    SELECT (emp.name, emp.salary) FROM emp
        WHERE emp.dept = "toy";
   

Tous les nouveaux employés qui doivent faire 5.000 ou moins :
CREATE RULE example_5 AS
    ON INERT TO emp WHERE new.salary > 5000
    DO UPDATE NEWSET salary = 5000;
   

Bugs

L'objet dans une règle SQL ne peut pas être une table référence et ne peut pas avoir de paramètres.

À côté du champ "oid", les attributs système ne peuvent pas être référencés quelque part dans une règle. Parmi d'autre choses, ceci montre que les fonctions d'instance (ex. foo(emp)emp est une classe) ne peuvent pas être appelées quelque part dans une règle.

Le système de règle stocke la règle text et les plans requêtes comme attributs text. Ceci implique que la création de règles peut échouer si la règle plus ses diverses représentations internes excèdent certaine valeur qui est de l'ordre d'une page (8k).

Compatibilité

La clause CREATE RULE est une extension du langage Postgres.

SQL92

Il n'existe pas de clause CREATE RULE en SQL92.