[Oracle 9i] Triggers sur les updates de tables
Bonjour,
Voici ma problématique : on me demande d'étudier la possibilité de tracer, à l'aide de triggers, les insertions ou updates effectués dans toutes les tables d'un schéma (environ 300).
Sachant que le traçage en question consiste à mettre à jour 2 champs (nom et date) appartenant à une des 4 tables "mères" dont héritent la plupart des tables.
Je me pose donc différentes questions :
1) Est-il possible de traiter tout ça à l'aide d'un seul trigger, ou bien n'y a-t-il pas d'autre possibilité que de créer un trigger pour chaque table ?
2) Pour une table donnée, comment spécifier quelle table "mère" doit être mise à jour en s'aidant de la contrainte foreign key entre les 2 tables ?
3) Dans le cas où une table "mère" est directement mise à jour (cas que je teste pour l'instant), je me heurte à l'erreur ORA-4091 de la table mutante. Comment la contourner ? J'ai lu le tutoriel de Pomalaix, très instructif, et tenté d'appliquer la gestion d'exception, et dans ce cas l'exception est bien levée, l'update de ma ligne est fait, mais pas celui de mes 2 champs de "suivi". Comment faire ?
Merci de votre aide :wink:
Zestrellita
Re: [Oracle 9i] Triggers sur les updates de tables
Citation:
Envoyé par zestrellita
1) Est-il possible de traiter tout ça à l'aide d'un seul trigger, ou bien n'y a-t-il pas d'autre possibilité que de créer un trigger pour chaque table ?
Pas à ma connaissance.
Citation:
Envoyé par zestrellita
2) Pour une table donnée, comment spécifier quelle table "mère" doit être mise à jour en s'aidant de la contrainte foreign key entre les 2 tables ?
Via les table ALL_CONTRAINTS ou USER_CONSTRAINTS et execute immediate.
Citation:
Envoyé par zestrellita
3) Dans le cas où une table "mère" est directement mise à jour (cas que je teste pour l'instant), je me heurte à l'erreur ORA-4091 de la table mutante. Comment la contourner ? J'ai lu le tutoriel de Pomalaix, très instructif, et tenté d'appliquer la gestion d'exception, et dans ce cas l'exception est bien levée, l'update de ma ligne est fait, mais pas celui de mes 2 champs de "suivi". Comment faire ?
Pourquoi ne faire un simple :
Code:
1 2
| :new.date_maj := sysdate;
:new.nom = 'MATABLE'; |
Re: [Oracle 9i] Triggers sur les updates de tables
Merci pour tes réponses très rapides :D
Citation:
Envoyé par plaineR
Citation:
Envoyé par zestrellita
1) Est-il possible de traiter tout ça à l'aide d'un seul trigger, ou bien n'y a-t-il pas d'autre possibilité que de créer un trigger pour chaque table ?
Pas à ma connaissance.
C'est ce qui me semblait oui :wink:
Citation:
Envoyé par plaineR
Citation:
Envoyé par zestrellita
2) Pour une table donnée, comment spécifier quelle table "mère" doit être mise à jour en s'aidant de la contrainte foreign key entre les 2 tables ?
Via les table ALL_CONTRAINTS ou USER_CONSTRAINTS et execute immediate.
C'est ce que j'ai tenté d'utiliser, mais ces vues n'indiquent pas le nom de la table référencée par la contrainte, seulement le nom de la table sur laquelle porte la contrainte.
Ou bien je dois simplement déduire le nom de la table du nom de la clé primaire référencée (R_CONSTRAINT_NAME) ? Mais dans le cas d'un nom de clé primaire non conforme, ça ne marche pas.
Citation:
Envoyé par plaineR
Citation:
Envoyé par zestrellita
3) Dans le cas où une table "mère" est directement mise à jour (cas que je teste pour l'instant), je me heurte à l'erreur ORA-4091 de la table mutante. Comment la contourner ? J'ai lu le tutoriel de Pomalaix, très instructif, et tenté d'appliquer la gestion d'exception, et dans ce cas l'exception est bien levée, l'update de ma ligne est fait, mais pas celui de mes 2 champs de "suivi". Comment faire ?
Pourquoi ne faire un simple :
Code:
1 2
| :new.date_maj := sysdate;
:new.nom = 'MATABLE'; |
En effet, ça marche très bien, merci :D J'avais cherché trop compliqué.
Re: [Oracle 9i] Triggers sur les updates de tables
Citation:
Envoyé par zestrellita
Citation:
Envoyé par plaineR
Citation:
Envoyé par zestrellita
2) Pour une table donnée, comment spécifier quelle table "mère" doit être mise à jour en s'aidant de la contrainte foreign key entre les 2 tables ?
Via les table ALL_CONTRAINTS ou USER_CONSTRAINTS et execute immediate.
C'est ce que j'ai tenté d'utiliser, mais ces vues n'indiquent pas le nom de la table référencée par la contrainte, seulement le nom de la table sur laquelle porte la contrainte.
Ou bien je dois simplement déduire le nom de la table du nom de la clé primaire référencée (R_CONSTRAINT_NAME) ? Mais dans le cas d'un nom de clé primaire non conforme, ça ne marche pas.
Si j'ai compris ce que tu voulais faire :
Code:
1 2 3 4 5
| select table_name
from user_constraints
where constraint_name in (select r_constraint_name
from user_constraints
where table_name = 'TABLE_FILLE'); |