Bonjour,
Je cherche à créer un trigger sur une table qui incrémente la valeur d'un champs sur un enregistrement donné après chaque modification.
Merci!
Bonjour,
Je cherche à créer un trigger sur une table qui incrémente la valeur d'un champs sur un enregistrement donné après chaque modification.
Merci!
Tu fais un TRIGGER BEFORE UPDATE FOR EACH ROWS
Et dans le code
Code : Sélectionner tout - Visualiser dans une fenêtre à part :new.compteur := NVL(:old.compteur,0) + 1;
Ne devrais-je pas faire aussi un update sur ce champs comme ceci ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 CREATE OR REPLACE TRIGGER trigger_name AFTER UPDATE ON table_name FOR EACH ROW DECLARE v_champs1 table_name.champs1%TYPE; BEGIN :new.champs1:= NVL(:old.champs1,0) + 1; END;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 BEGIN :new.champs1:= NVL(:old.champs1,0) + 1; update table_name set champs1 = :new.champs1 where id = v_id (que je déclare ?) END;
Houla surtout pas malheureux !
Il va falloir que tu regardes une doc sur les triggers (je ne sais pas s'il y en a dans les tutoriels)
Le premier code est quasi juste :
C'est BEFORE et v_champs1 ne sert à rien et pas de DECLARE
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 CREATE OR REPLACE TRIGGER trigger_name BEFORE UPDATE ON table_name FOR EACH ROW BEGIN :new.champs1:= NVL(:old.champs1,0) + 1; END;
En fait je voudrais pouvoir dupliquer dans la table l'enregistrement qui a été modifié avec les mêmes données en incrémentant le champs1 comme dit précédemment.
Par exemple:
si je modifie champs2, je voudrais avoir une ligne comme ci-dessous:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Table1 ------ id | champs0 | champs1 | champs2 etc... --------------------------------------- 1 | aaa | 0 | aaaaa
Merci !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 id | champs0 | champs1 | champs2 etc... --------------------------------------- 1 | aaa | 0 | aaaaa 2 | aaa | 1 (0+1) | baaaa
Voici mon code:
J'ai l'erreur suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 CREATE OR REPLACE TRIGGER trigger_name BEFORE UPDATE ON table_name FOR EACH ROW BEGIN INSERT INTO table_name(champs0,champs1,champs2) VALUES(:new.champs0,NVL(:old.champs1,0) +1,:new.champs2) END;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 [1]: (Error): ORA-04091: table SYSADM.table_name is mutating, trigger/function may not see it ORA-06512: at "SYSADM.trigger_name", line 3 ORA-04088: error during execution of trigger 'SYSADM.trigger_name
Oubliez les triggers, fait un API PL/SQL qui fait ce que vous en avez besoin.
Sinon, il y a des quelques solutions de type usine à gaz avec les triggers.
Je voudrais bien faire un trigger pourquoi pas une solution de type usine à gaz.
Et si tu modifies 15 fois la première ligne ?
Si ton but est d'avoir un historique, crées une table historique et insère dedans.
Surtout que si tu fais ça tu vas avoir l'erreur "ORA-XXX Table en mutation". (Enfin je crois )
Très bien !
Regardez le tutoriel concernant la résolution de la table mutante sur ce site.
Lisez cet article pour mieux comprendre pourquoi la solution de la table mutante n’est pas une vrai solution.
Comme astuce: aux lieux d’insérer les enregistrements dans le trigger demandez à dbms_job de le faire via le trigger.
Et rappelez-vous que la table mutante c’est un bug dans votre application.
Merci à tous!
Je ne sais pas si le fait de récupérer le max(id) dans une variable et d'incrémenter la variable à chaque insertion pour éviter Erreur ORA-00001: violation de contrainte est une bonne solution ?
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager