Bonjour,
je rencontre un problème pour la création d'un trigger. Je souhaite détecter sur un UPDATE le nom du champ modifié ainsi que l'ancienne valeur et la nouvelle pour les insérés dans une table de traçage.
Le problème est le suivant : ma table d'origine contient plus de 50 champs. Du coup, je souhaitais faire tourner une boucle parcourant la liste des champs et testant l'égalité entre ancienne et nouvelle valeur. En cas d'inégalité, on insère ces valeurs dans la table TRACE.
Mais un point me bloc : si le PLSQL permet d'utiliser :OLD.champ et :NEW.champ, il ne permet pas d'utiliser les variables :OLD.tmp et :NEX.tmp où tmp := 'champ1'.
Pour plus de compréhension voici le code de mon trigger :
----------------------------------------------------
------------------------------
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 CREATE OR REPLACE TRIGGER immo_modif AFTER UPDATE ON immo_pphys FOR EACH ROW DECLARE champ VARCHAR2(50); cursor lignetmp is SELECT COLUMN_NAME,DATA_TYPE FROM user_tab_columns WHERE table_name = 'IMMO_PPHYS'; ligne_rec lignetmp%ROWTYPE; BEGIN open lignetmp; loop fetch lignetmp into ligne_rec; exit when lignetmp%NOTFOUND; IF :OLD.ligne_rec.COLUMN_NAME <> :NEW.ligne_rec.COLUMN_NAME then insert INTO immo_trace (champ,OLD,new) values (ligne_rec.COLUMN_NAME,':OLD.'||ligne_rec.COLUMN_NAME,':NEW.'||ligne_rec.COLUMN_NAME); END if; end loop; close lignetmp; END;
Est-il possible de déclarer des variables de type 'colonne' ?
--> actuellement mes colonnes ligne_rec.column_name sont en fait de simples varchar...
Merci à toute personne capable de m'aiguiller vers une méthode autre qu'un IF .. ELSE IF ..ELSE IF sur chaque nom de champ.
PS : je suis sous ORACLE 8i
Partager