Vous n'êtes pas identifié(e).
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.
Chris
Hors ligne
Ça dépend du langage de procédures. Pour PL/pgsql, tout est expliqué sur http://docs.postgresql.fr/9.0/plpgsql-trigger.html.
Guillaume.
Hors ligne
Bonjour,
merci pour votre réponse. votre lien ne fonctionne pas mais j'ai celui ci qui correspond à ce que je souhaite faire. http://docs.postgresqlfr.org/8.0/plpgsql-trigger.html.
est ce que ceci est juste
create function histo_audit() returns trigger as $histo$
begin
--ajoute une ligne dans la table histo pour refleter l'operation réalisé sur les tables
--utilise la variable spéciale TG_OP pour cette opération
--
if(TG_OP='DELETE') then
insert into histo_uliss select 'D',now(),user,TG_Relid,TG_Relname;
return old;
elsif (TG_OP='UPDATE') then
insert into histo_uliss select 'U',now(),user,TG_Relid,TG_Relname;
return new;
elsif (TG_OP='INSERT') then
insert into histo_uliss select 'I',now(),user,TG_Relid,TG_Relname;
return new;
end if;
return null; -- le résultat est ignoré car il s'agit d'un déclencheur AFTER
end;
$histo$ language plpgsql;
CREATE TRIGGER histo
AFTER INSERT or Update or DELETE on utilisateur
for each row execute procedure histo_audit();
Hors ligne
Mon lien était bon mais apparemment, le point de fin de phrase a été mis dans le lien.
Cela étant dit, votre code a l'air bon. Attention à tg_relname qui est obsolète. Il fonctionne toujours mais pourrait être abandonné dans une version future.
Quant à l'historisation, vous feriez mieux de télécharger des outils qui le font déjà. Il y a au moins tablelog et e-maj (tous les deux dispos sur pgfoundry).
Guillaume.
Hors ligne
bonjour,
merci de votre réponse. est ce mieux d'utiliser tg_table_name a la place de tg_relname?
je vais regarde aller voir tablelog.
Hors ligne
Oui, tg_table_name est la bonne variable.
Guillaume.
Hors ligne
bonjour,
j'ai voulu mettre en place le trigger mais quand j'ai fait un insert sur une table ou le trigger porte j'ai eu ce message d'erreur:
error: column "tg_table_name" does not exist
context: sql statement "insert into histo select 'I',now(),user,$i,TG_table_name
pl/pgsql function "histo_audit" line 9 at sql statement
la ligne 9 correspond a ceci :
elsif (TG_OP='INSERT') then
j'ai oublie de préciser que postgresql est la version 8.4. est ce que cela a un rapport?
merci d'avance.
Hors ligne
Oui. C'est dispo qu'à partir de la version 9.0.
Guillaume.
Hors ligne
ok. j'ai essaye avec tg_relname est cela fonctionne.
la seule chose qui ne fonctionne pas c'est l'id de l'enregistrement modifié.
je m'explique:
insert into profil (id,libelle,datecreation) values ('PROF649302','gestionnaire de site',now());
INSERT 0 1
select * from histo;
id | typemod | datemodif | usermodif | idmodif | tablemodif
---------+-----------+---------------+------------+---------+------------
histo453 | I | 2011-02-07 | postgres | 152476 | profil
idmodif vaut 152476 alors que je voudrai que ca soit prof649302. je ne sais pas si c'est bien possible.
voici la partie de la fonction qui nous intéresse ici
elsif (TG_OP='INSERT') then
insert into histo_uliss select 'histo453','I',now(),user,TG_Relid,TG_RELNAME;
return new;
merci d'avance pour toutes idées.
ps: une petite question qui n'a rien avoir: quand on insert et que tout se passe bien on a ce message
insert 0 1
que signifie 0 1?
Hors ligne
je viens de trouver. je dois utiliser new.id ou old.id selon le cas.
merci
Hors ligne
Exact.
Guillaume.
Hors ligne
merci beaucoup pour votre aide.
Hors ligne