Bonjour,
Je crois que tout est dans le titre, petit rappel
Raison de l'impossibilité de faire un SELECT dans un trigger BEFORE DELETE ?
Merci d'avance Tchô !
Bonjour,
Je crois que tout est dans le titre, petit rappel
Raison de l'impossibilité de faire un SELECT dans un trigger BEFORE DELETE ?
Merci d'avance Tchô !
Non ça n'est pas du tout explicite, postez un exemple de votre problème
Désolé, je voulais dire pourquoi il est impossible de faire un SELECT sur la table que l'on va modifier dans un trigger BEFORE DELETE.
La doc dit que c'est parce que la table est en cours de mutation mais je ne vois pas le problème...
Si ce n'est toujours pas clair je mettrai un exemple![]()
Pourtant cela fonctionne, donc poste un exemple
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SQL> select version from v$instance; VERSION ----------------- 12.2.0.1.0
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 SQL> CREATE TABLE wmc (a number); Table created. SQL> CREATE OR REPLACE TRIGGER wmc_bd BEFORE DELETE ON wmc 2 DECLARE 3 v number; 4 BEGIN 5 SELECT COUNT(*) INTO v FROM wmc; 6 DBMS_OUTPUT.put_line('NB lig :'||v); 7 END; 8 / Trigger created.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 SQL> INSERT INTO wmc VALUES(1); 1 row created. SQL> INSERT INTO wmc VALUES(2); 1 row created. SQL> INSERT INTO wmc VALUES(3); 1 row created.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SQL> set serveroutput on SQL> DELETE wmc WHERE a = 1; NB lig :3 1 row deleted.
Le problème de table en mutation apparaît dans le cadre d'un trigger for each row, et pas dans le cadre de statement trigger.
Pour le pourquoi, il faut comprendre :
Data Concurrency and Consistency
Depuis la 11g, il est possible de créer des compound trigger qui permettent de contourner ce problème :
Compound Triggers
Une modification du modèle peut également permettre d'éviter de sélectionner la table en mutation.
Merci beaucoup c'est bien plus clair maintenant, c'est lié au for each row et ça me paraît bien plus logique.
J'ai fait un petit recap des possibilités de SELECT par TRigger
Merci encore !
Partager