Qui peut créer un déclencheur DML ?
Les déclencheurs DML peuvent être créés par :
-
Propriétaire de la table (vue) ;
-
Utilisateurs ayant le privilège
ALTER ANY {TABLE | VIEW}
Les déclencheurs DML peuvent être créés par :
Propriétaire de la table (vue) ;
Utilisateurs ayant le privilège ALTER ANY {TABLE | VIEW}
CREATE TRIGGER SET_CUST_NO FOR CUSTOMER
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.CUST_NO IS NULL) THEN
NEW.CUST_NO = GEN_ID(CUST_NO_GEN, 1);
END
CREATE TRIGGER set_cust_no
ACTIVE BEFORE INSERT ON customer POSITION 0
AS
BEGIN
IF (NEW.cust_no IS NULL) THEN
NEW.cust_no = GEN_ID(cust_no_gen, 1);
END
CREATE TRIGGER set_cust_no
ACTIVE BEFORE INSERT ON customer POSITION 0
SQL SECURITY DEFINER
AS
BEGIN
IF (NEW.cust_no IS NULL) THEN
NEW.cust_no = GEN_ID(cust_no_gen, 1);
END
CREATE TRIGGER TR_CUST_LOG
ACTIVE AFTER INSERT OR UPDATE OR DELETE
ON CUSTOMER POSITION 10
AS
BEGIN
INSERT INTO CHANGE_LOG (LOG_ID,
ID_TABLE,
TABLE_NAME,
MUTATION)
VALUES (NEXT VALUE FOR SEQ_CHANGE_LOG,
OLD.CUST_NO,
'CUSTOMER',
CASE
WHEN INSERTING THEN 'INSERT'
WHEN UPDATING THEN 'UPDATE'
WHEN DELETING THEN 'DELETE'
END);
END
Un déclencheur peut être créé pour l’un des événements de la base de données :
CONNECT
(connexion à la base de données ou après réinitialisation de la session) ;
DISCONNECT
(déconnexion de la base de données ou avant la réinitialisation de la session) ;
TRANSACTION START
(début de transaction) ;
TRANSACTION COMMIT
(confirmation de la transaction) ;
TRANSACTION ROLLBACK
(retour en arrière de la transaction).
La variable de contexte RESETTING peut être utilisée dans les déclencheurs des événements CONNECT
et DISCONNECT
pour distinguer la réinitialisation de la session de la connexion/déconnexion de la base de données.
Il n’est pas possible de spécifier plus d’un événement de base de données pour un déclencheur.
Les déclencheurs sur les événements CONNECT
et DISCONNECT
sont exécutés dans une transaction spécialement créée à cet effet.Si aucune exception n’est levée lors du traitement du déclencheur, la transaction est acquittée.Les exceptions non vérifiées annuleront la transaction et :
dans le cas d’un déclencheur d’événement CONNECT
, la connexion est rompue et des exceptions sont renvoyées au client ;
Pour un événement déclencheur DISCONNECT
, la connexion est terminée comme prévu, mais les exceptions ne sont pas renvoyées au client.
Les déclencheurs d’événements CONNECT
et DISCONNECT
sont également déclenchés lorsque l’instruction de réinitialisation de l’environnement de session est exécutée.Voir la section ALTER SESSION RESET pour les particularités de la gestion des erreurs dans les déclencheurs des événements CONNECT
et DISCONNECT
.
Les déclencheurs sur les événements de transaction sont déclenchés au début de la transaction, à sa confirmation ou à son retour.Les exceptions non vérifiées sont traitées en fonction du type d’événement :
pour l’événement TRANSACTION START
, l’exception est renvoyée au client et la transaction est annulée ;
pour l’événement TRANSACTION COMMIT
, l’exception est retournée au client, l’action effectuée par le déclencheur et la transaction sont annulées ;
Pour l’événement TRANSACTION ROLLBACK
, l’exception n’est pas renvoyée au client et la transaction est annulée comme prévu.
Il résulte de ce qui précède qu’il n’y a pas de moyen direct de savoir quel déclencheur (DISCONNECT
ou ROLLBACK
) a soulevé l’exception.Il est également clair que vous ne pouvez pas vous connecter à la base de données lorsqu’il y a une exception dans le déclencheur d’événements CONNECT
, et le démarrage d’une transaction est également annulé lorsqu’il y a une exception dans le déclencheur d’événements TRANSACTION START
.Dans les deux cas, la base de données est effectivement verrouillée jusqu’à ce que vous désactiviez les déclencheurs de la base de données et corrigiez le code erroné.