|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre habitué
![]() Chris Développeur Web Inscription : mai 2010 Messages : 225 ![]() |
Bonjour,
Je souhaiterai mettre en place un trigger qui insert des lignes dans une table d'historique dès qu'un utilisateur fait des modifications sur la base. J'aimerai pouvoir récupère le nom de la table modifié, l'identifiant de la ligne, l'utilisateur qui a fait cette modification, quel est le type de la modification (update,delete,insert), et la date. Pour le moment, je n'ai que la date que je sais comment récupère mais le reste je ne sais pas. Est ce possible de récupère ces informations? Merci d'avance pour tout informations. |
|
|
00
|
|
|
#2 |
![]() ![]() Inscription : octobre 2008 Messages : 1 505 ![]() |
Qu'entends-tu par "l'identifiant de la ligne" ? Car par défaut, une ligne de table n'a pas spécialement d'identifiant unique stable. A moins que les tables soient déclarées WITH OIDS mais cet usage est en voie d'obsolescence.
|
|
|
00
|
|
|
#3 |
![]() ![]() Inscription : octobre 2008 Messages : 1 505 ![]() |
Pour les autres données, l'utilisateur s'obtient par la fonction current_user, le nom de la table en argument du trigger avec TG_ARGV, et le nom de l'opération avec TG_OP.
|
|
|
00
|
|
|
#4 |
|
Membre habitué
![]() Chris Développeur Web Inscription : mai 2010 Messages : 225 ![]() |
Bonjour,
je te remercie de tes réponses. "Qu'entends-tu par "l'identifiant de la ligne" ?" enfaite je parle de la clé primaire de l'enregistrement qui a été modifié. |
|
|
00
|
|
|
#5 | ||
|
Membre habitué
![]() Chris Développeur Web Inscription : mai 2010 Messages : 225 ![]() |
De plus, j'aimerai savoir si c'est possible d'utiliser le même trigger et fonction pour 10 tables différentes?
pour faire le trigger je me vais m'appuyer sur cette exemple Code :
Code :
AFTER INSERT OR UPDATE OR DELETE ON emp Code :
AFTER INSERT OR UPDATE OR DELETE ON emp ON salarie ON ... je sais pas si c'est bien clair. |
||
|
|
00
|
|
|
#6 |
![]() ![]() Inscription : octobre 2008 Messages : 1 505 ![]() |
Non un même trigger ne peut pas être associé à plusieurs tables, mais une même fonction peut être associée à plusieurs triggers.
La difficulté principale pour étendre l'exemple montré à de multiples tables est qu'il déverse dans une unique table d'audit dont la structure est spécifiquement liée à une seule table. Pour pouvoir insérer dans une table d'audit déterminée dynamiquement il faut utiliser du SQL dynamique avec EXECUTE et le code va être un niveau de difficulté au-dessus. Pour la clef primaire, il faut voir qu'il n'y a pas d'obligation pour une table d'avoir une clef primaire, et que si elle en a une, une clef primaire peut porter sur de multiples colonnes. |
|
|
00
|
|
|
#7 | ||
|
Membre habitué
![]() Chris Développeur Web Inscription : mai 2010 Messages : 225 ![]() |
D'accord merci pour ces informations.
" mais une même fonction peut être associée à plusieurs triggers." comment une fonction peut être associé a plusieurs trigger étant donnée que dans l'entête on spécifie le nom du trigger? Code :
|
||
|
|
00
|
|
|
#8 | ||||
![]() ![]() Inscription : octobre 2008 Messages : 1 505 ![]() |
Citation:
Citation:
|
||||
|
|
00
|
|
|
#9 |
|
Membre habitué
![]() Chris Développeur Web Inscription : mai 2010 Messages : 225 ![]() |
Quand on dit cela veut bien dire retourné le trigger histo? ou j'ai vraiment mal compris
TG_RELID l'ID de l'objet de la table qui a causé le déclenchement. TG_RELNAME Type de données nom ; le nom de la table qui a causé le déclenchement. |
|
|
00
|
|
|
#10 |
![]() ![]() Inscription : octobre 2008 Messages : 1 505 ![]() |
Non ça veut dire totalement autre chose. $histo$ est une balise syntaxique qui encadre le code qui suit juste après. La valeur pourrait aussi bien être $toto$ ou encore $$, tant que cette valeur ne se trouve pas aussi dans le code lui-même, puisqu'elle sert justement à le délimiter.
|
|
|
00
|
|
|
#11 |
|
Membre habitué
![]() Chris Développeur Web Inscription : mai 2010 Messages : 225 ![]() |
ok merci pour ces informations.
je vais tester tout cela. |
|
|
00
|
|
|
#12 | ||||
|
Membre habitué
![]() Chris Développeur Web Inscription : mai 2010 Messages : 225 ![]() |
Bonjour,
j'ai mis en place le trigger. j'utilise tg_relname car la version de postgres est la 8.4 donc tg_table_name ne fonctionne pas. après cette modification le trigger marche dés que je fais un insert,update.. mais la seule chose qui ne fonctionne pas c'est l'id de l'enregistrement modifié. je m'explique: Code :
voici la partie de la fonction qui nous intéresse ici Code :
|
||||
|
|
00
|
|
|
#13 |
|
Membre habitué
![]() Chris Développeur Web Inscription : mai 2010 Messages : 225 ![]() |
je viens de trouver.
je dois utiliser new.id ou old.id. merci |
|
|
00
|
|
|
#14 |
![]() ![]() Inscription : octobre 2008 Messages : 1 505 ![]() |
|
|
|
00
|
|
|
#15 | ||
|
Membre habitué
![]() Chris Développeur Web Inscription : mai 2010 Messages : 225 ![]() |
Bonjour,
je sais pas. j'ai eu ce message quand j'utilisais tg_table_name: Code :
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com