CREATE RULE

Nom

CREATE RULE -- définit une nouvelle règle de réécriture

Synopsis

CREATE [ OR REPLACE ] RULE nom AS
ON événement
    TO table [ WHERE condition ]
    DO [ INSTEAD ] { NOTHING | commande | ( commande ; commande ... ) }

Description

CREATE RULE définit une nouvelle règle s'appliquant à une table ou à une vue. CREATE OR REPLACE RULE soit créera une nouvelle règle soit remplacera une règle existante du même nom pour la même table.

Le système de règles de PostgreSQL autorise la définition d'actions alternatives à réaliser sur les insertions, mises à jour ou suppressions dans les tables de la base de données. Directement, une règle fait que des commandes supplémentaires soient exécutées lorsqu'une commande donnée est exécutée sur une table donnée. Autrement dit, une règle peut remplacer une commande donnée par un autre ou faire qu'une commande ne soit pas exécutée du tout. Les règles sont aussi utilisées pour implémenter les vues de tables. Il est important de réaliser qu'une règle est réellement un mécanisme de transformation de commandes. La transformation survient avant le début de l'exécution de la commande. Si vous voulez réellement une opération qui s'exécute indépendamment pour chaque ligne physique, vous voulez probablement utiliser un déclencheur et non pas une règle. Plus d'informations sur le système des règles se trouvent dans Chapitre 34.

Actuellement, les règles ON SELECT doivent être des règles INSTEAD sans condition et doivent avoir des actions consistant en une simple commande SELECT. Du coup, une règle ON SELECT transforme réellement la table en une vue dont le contenu visible est les lignes renvoyées par la commande SELECT de la règle plutôt que les lignes qui sont stockées dans la table (si elles existent). Il est mieux considéré d'écrire une commande CREATE VIEW plutôt que de créer une vraie table et de définir une règle ON SELECT sur elle.

Vous pouvez créer l'illusion d'une vue pouvant être mise à jour en définissant les règles ON INSERT, ON UPDATE et ON DELETE (ou tout sous-ensemble de celles suffisantes à vos buts) pour remplacer les actions de mises à jour sur la vue par des mises à jours appropriées sur les autres tables.

Voici une astuce si vous utilisez les règles conditionnelles pour les mises à jour de vues : elle doit être une règle INSTEAD sans condition pour chaque action que vous souhaitez autoriser sur la vue. Si la règle est conditionnelle ou si elle n'est pas INSTEAD, alors le système rejettera toutes tentatives d'exécution de l'action de mise à jour parce qu'il pense qu'il pourrait finir par essayer de réaliser l'action sur la table de la vue dans certains cas. Si vous souhaitez gérer tous les cas utiles dans les règles conditionnelles, vous pouvez ; ajoutez seulement une règle DO INSTEAD NOTHING sans condition pour vous assurer que le système comprend qu'il ne sera jamais appelé pour modifier la table. Puis, rendez les règles conditionnelles en non INSTEAD ; dans les cas où cela s'applique, elles ajoutent à l'action INSTEAD NOTHING par défaut.

Paramètres

nom

Le nom d'une règle à créer. Elle doit être distincte du nom de toute autre règle sur la même table. Les règles multiples sur la même table et le même type d'événement sont appliquées dans l'ordre alphabétique des noms.

événement

L'événement est un de ceux-ci : SELECT, INSERT, UPDATE ou DELETE.

table

Le nom (pouvant être qualifié par le nom du schéma) de la table ou de la vue où s'applique la règle.

condition

Toute expression SQL conditionnelle (renvoyant le type boolean). L'expression de condition ne peut pas référer à une table autre que NEW et OLD et ne peut pas contenir de fonction d'agrégat.

commande

La où les commandes réalisant l'action de la règle. Les commandes valides sont SELECT, INSERT, UPDATE, DELETE ou NOTIFY.

À l'intérieur d'une condition et d'une commande, les noms de tables spéciales NEW et OLD pourraient être utilisés pour se référer aux valeurs de la table référencée. NEW est valide dans les règles ON INSERT et ON UPDATE pour référencer la nouvelle ligne en cours d'insertion ou de mise à jour. OLD est valide dans les règles ON UPDATE et ON DELETE pour référencer la ligne existante en cours de modification ou de suppression.

Notes

Vous devez avoir le droit RULE sur une table pour être autorisé à définir une règle sur elle.

Il est très important de faire attention aux règles circulaires. Par exemple, bien que chacune des deux définitions de règles est acceptée par PostgreSQL, la commande SELECT fera que PostgreSQL rapportera une erreur parce que la requête sera en boucle trop longtemps :

CREATE RULE "_RETURN" AS
    ON SELECT TO t1
    DO INSTEAD 
	SELECT * FROM t2;

CREATE RULE "_RETURN" AS
    ON SELECT TO t2
    DO INSTEAD 
	SELECT * FROM t1;

SELECT * FROM t1;

Actuellement, si l'action d'une règle contient une commande NOTIFY, cette commande sera exécutée sans condition, c'est-à-dire que le NOTIFY sera envoyé même si aucune lignes de la règle ne s'applique. Par exemple, dans

CREATE RULE notify_me AS ON UPDATE TO matable DO NOTIFY matable;

UPDATE matable SET name = 'foo' WHERE id = 42;

un événement NOTIFY sera lancé durant un UPDATE, qu'il y ait ou non des lignes satisfaisant la condition id = 42. L'implémentation de cette restriction pourrait être corrigée dans les prochaines versions.

Compatibilité

CREATE RULE est une extension du langage de PostgreSQL ainsi que tout le système de règles.