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!
Version imprimable
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::new.compteur := NVL(:old.compteur,0) + 1;
Ne devrais-je pas faire aussi un update sur ce champs comme ceci ?Code:
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:
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;
8O Houla surtout pas malheureux ! :lol:
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:
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:
1
2
3
4
5
6 Table1 ------ id | champs0 | champs1 | champs2 etc... --------------------------------------- 1 | aaa | 0 | aaaaa
Merci !Code:
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:
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:
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 8O)
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 ?