CREATE TRIGGER

Name

CREATE TRIGGER  --  Définit un nouveau déclencheur

Synopsis

CREATE TRIGGER name { BEFORE | AFTER } { event [OR ...] }
    ON table FOR EACH { ROW | STATEMENT }
    EXECUTE PROCEDURE func ( arguments )
  

Entrées

name

Nom à donner au nouveau déclencheur

table

Le nom d'une table existante.

event

Un des INSERT, DELETE ou UPDATE.

func

Une fonction utilisateur.

Sorties

CREATE

Message retourné quand le déclencheur a été créé correctement.

Description

[1]

CREATE TRIGGER entrera un nouveau déclencheur dans la base. Le déclencheur sera associé à la relation table et exécutera la fonction spécifiée func.

Le déclencheur peut être spécifié soit pour démarrer AVANT que l'opération soit tentée sur un tuple (avant que les contraintes soient vérifiées et les INSERT, UPDATE ou DELETE soient tentés) ou APRÉS que les opérations aient été tentées (ex., après que les contraintes soient vérifiées et les INSERT, UPDATE ou DELETE soient complétés). Si le déclencheur s'exécute avant l'événement, le déclencheur peut sauter l'opération pour le tuple courant ou changer le tuple étant inséré (pour les opérations INSERT et UPDATE seulement). Si le déclencheur s'exécute après l'événement, tous les changements, incluant la dernière insertion, mise à jour ou suppression, sont "visibles" par le déclencheur.

SELECT ne modifie aucune ligne, aussi vous ne pouvez pas créer de déclencheurs SELECT. Les règles et les vues sont plus appropriées dans certains cas.

Voir les chapitres sur SPI et les déclencheurs du Guide du programmeur PostgreSQL pour plus d'information.

Notes

Pour créer un déclencheur sur une table, l'utilisateur doit avoir les droits de TRIGGER sur la table.

Dans cette version, les déclencheurs STATEMENT ne sont pas implémentés.

Voir la commande DROP TRIGGER pour savoir comment supprimer des déclencheurs.

Exemples

Vérifie si le code distributeur spécifié existe dans les tables distributeurs avant de rejouter ou de mettre à jour une ligne dans la table films :

CREATE TRIGGER if_dist_exists
    BEFORE INSERT OR UPDATE ON films FOR EACH ROW
    EXECUTE PROCEDURE check_primary_key ('did', 'distributors', 'did');

Avant d'annuler un distributor ou de mettre à jour son code, supprime chaque référence à la table films :

CREATE TRIGGER if_film_exists 
    BEFORE DELETE OR UPDATE ON distributors FOR EACH ROW
    EXECUTE PROCEDURE check_foreign_key (1, 'CASCADE', 'did', 'films', 'did');

Le second exemple peut aussi être réalisé en utilisant une clé étrangère, contrainte comme dans :

CREATE TABLE distributors (
    did      DECIMAL(3),
    name     VARCHAR(40),
    CONSTRAINT if_film_exists
    FOREIGN KEY(did) REFERENCES films
    ON UPDATE CASCADE ON DELETE CASCADE  
);

Compatibilité

SQL92

Il n'y a pas d'instruction CREATE TRIGGER en SQL92.

SQL99

L'instruction CREATE TRIGGER dans PostgreSQL implémente un sous-ensemble du standard SQL99. Les fonctionnalités suivantes sont manquantes :

  • SQL99 allows triggers to fire on updates to specific columns (e.g., AFTER UPDATE OF col1, col2).

  • SQL99 vous permet de définir des alises pour les "anciennes" et les "nouvelles" lignes ou tables pour leur utilisation dans la définition d'une action déclenchée (ex., CREATE TRIGGER ... ON tablename REFERENCING OLD ROW AS somename NEW ROW AS othername ...). PostgreSQL admet que les procédures soient écrites en diverses formes de langages utilisateurs, languages, l'accès aux données est maintenu dans un langage spécifique.

  • PostgreSQL ne possède que des déclencheurs niveau-ligne, pas de déclencheurs au niveau-instruction.

  • PostgreSQL permet seulement l'exécution d'une procédure stockée pour l'action déclencheur. SQL99 admet l'exécution d'un nombre d'autres commandes SQL, comme CREATE TABLE comme action déclencheur. Cette limitation n'est pas difficile à contourner en créant une procédure stockée qui exécute ces commandes.

Voir aussi

CREATE FUNCTION, DROP TRIGGER , Guide du programmeur PostgreSQL

Notes

[1]

NdT. Un déclencheur est un mécanisme permettant d'activer une procédure cataloguée lors de l'apparition de conditions particulières dans la base de données.