CREATE TRIGGER
CREATE TRIGGER — Définir un nouveau déclencheur
Synopsis
CREATE TRIGGER nom { BEFORE | AFTER } { evenement [ OR ... ] }
ON table [ FOR [ EACH ] { ROW | STATEMENT } ]
EXECUTE PROCEDURE nomfonc ( arguments )
Description
CREATE TRIGGER
crée
un nouveau déclencheur. Le déclencheur est associé à la table
spécifiée et exécute la fonction
nomfonc
lorsque certains événements
surviennent.
L'appel du déclencheur peut avoir lieu avant que l'opération ne
soit tentée sur une ligne (avant la vérification des contraintes et
la tentative d'
INSERT
,
UPDATE
ou
DELETE
) ou une fois que
l'opération est terminée (après la vérification des contraintes et
la fin de la commande
INSERT
,
UPDATE
ou
DELETE
). Si le déclencheur est
lancé avant l'événement, le déclencheur peut ignorer l'opération
sur la ligne courante ou modifier la ligne en cours d'insertion
(uniquement pour les opérations
INSERT
et
UPDATE
). Si le déclencheur est
activé après l'événement, toute modification, dont la dernière
insertion, mise à jour ou suppression, est « visible » par le déclencheur.
Un déclencheur marqué FOR EACH ROW est
appelé pour chaque ligne que l'opération modifie. Par exemple, un
DELETE
affectant dix
lignes entraîne dix appels distincts de tout déclencheur ON DELETE sur la relation cible, une fois par ligne
supprimée. Au contraire, un déclencheur marqué FOR EACH STATEMENT ne s'exécute qu'une fois pour une
opération donnée, quelque soit le nombre de lignes modifiées (en
particulier, une opération qui ne modifie aucune ligne résulte
toujours en l'exécution des déclencheurs FOR
EACH STATEMENT applicables).
Si plusieurs déclencheurs du même genre sont définis pour le même
événement, ils sont déclenchés suivant l'ordre alphabétique de leur
nom.
SELECT
ne modifie
aucune ligne ; la création de déclencheurs sur
SELECT
n'est donc pas possible.
Les règles et vues sont plus appropriées dans ce cas.
Chapitre 34,
Déclencheurs (triggers) présente de plus amples informations
sur les déclencheurs.
Paramètres
-
nom
-
Le nom du nouveau déclencheur. Il doit être distinct du nom
de tout autre déclencheur sur la table.
-
BEFORE,
AFTER
-
Détermine si la fonction est appelée avant ou après
l'événement.
-
événement
-
Peut-être
INSERT
,
UPDATE
ou
DELETE
; précise
l'événement qui active le déclencheur. Plusieurs événements
peuvent être précisés en les séparant par OR.
-
table
-
Le nom (éventuellement qualifié du nom du schéma) de la table
à laquelle est rattaché le déclencheur.
-
FOR EACH
ROW,
FOR
EACH STATEMENT
-
Précise si la procédure du déclencheur doit être lancée pour
chaque ligne affectée par l'événement ou simplement pour
chaque instruction SQL. FOR EACH
STATEMENT est la valeur par défaut.
-
nomfonc
-
Une fonction utilisateur, déclarée sans argument et renvoyant
le type trigger, exécutée à
l'activation du déclencheur.
-
arguments
-
Une liste optionnelle d'arguments séparés par des virgules à
fournir à la fonction lors de l'activation du déclencheur.
Les arguments sont des chaînes littérales constantes. Il est
possible d'écrire ici de simples noms et des constantes
numériques mais ils sont tous convertis en chaîne. L'accès
aux arguments du trigger depuis la fonction peut différer de
l'accès aux arguments d'une fonction standard ; la
consultation des caractéristiques d'implantation du langage
de la fonction peut alors s'avérer utile.
Notes
Pour créer un déclencheur sur une table, l'utilisateur doit
posséder le droit TRIGGER sur la table.
Dans les versions de PostgreSQL™ antérieures à la 7.3, il
était nécessaire de déclarer un type opaque de retour pour les fonctions déclencheur,
plutôt que trigger. Pour pouvoir charger
d'anciens fichiers de sauvegarde,
CREATE TRIGGER
accepte qu'une
fonction déclare une valeur de retour de type opaque, mais il affiche un message d'avertissement et
change le type de retour déclaré en trigger.
DROP TRIGGER est utilisé pour supprimer un
déclencheur.
Compatibilité
L'instruction
CREATE
TRIGGER
de PostgreSQL™ implante un sous-ensemble du
standard SQL. Les
fonctionnalités manquantes sont :
-
SQL permet aux déclencheurs de se lancer dans des mises à
jour de colonnes spécifiques (c'est-à-dire AFTER UPDATE OF col1, col2).
-
SQL permet de définir des alias pour les lignes
« old » et
« new » ou pour les
tables utilisée dans la définition des actions déclenchées
(c'est-à-dire CREATE TRIGGER ... ON
nomtable REFERENCING OLD ROW AS unnom NEW ROW AS
unautrenom...). PostgreSQL™ autorise l'écriture de
procédures de déclencheurs dans tout langage l'utilisateur.
De ce fait, l'accès aux données est géré spécifiquement pour
chaque langage.
-
PostgreSQL™ n'autorise
comme action déclenchée que l'exécution d'une fonction
utilisateur. Le standard SQL, en revanche, autorise
l'exécution d'autres commandes SQL, telles que
CREATE TABLE
. Cette
limitation de PostgreSQL™ peut être facilement
contournée par la création d'une fonction utilisateur qui
exécute les commandes désirées.
Le standard SQL définit l'ordre de création comme ordre de
lancement des déclencheurs multiples. PostgreSQL™ utilise l'ordre alphabétique
de leur nom, jugé plus pratique.
Le standard SQL précise que les déclencheurs BEFORE DELETE sur des suppressions en cascade se
déclenchent
après
la fin du
DELETE en cascade. PostgreSQL™ définit que BEFORE DELETE se déclenche toujours avant l'action
de suppression, même lors d'une action en cascade. Cela semble plus
cohérent. Le comportement est imprévisible lorsque des déclencheurs
BEFORE modifient des lignes elles-mêmes
modifiées ensuite par les actions référentielles. Cela peut
conduire à des violations de contraintes ou à des données stockées
qui ne respectent plus la contrainte de référence.
La capacité à préciser plusieurs actions pour un seul déclencheur
avec OR est une extension PostgreSQL™.