Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#1 02/02/2011 12:34:45
- chris0938
- Membre
trigger historisation des modifications sur une base de données
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
#2 02/02/2011 15:33:09
- gleu
- Administrateur
Re : trigger historisation des modifications sur une base de données
Ç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
#3 03/02/2011 16:58:14
- chris0938
- Membre
Re : trigger historisation des modifications sur une base de données
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
#4 04/02/2011 00:49:50
- gleu
- Administrateur
Re : trigger historisation des modifications sur une base de données
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
#5 04/02/2011 10:40:15
- chris0938
- Membre
Re : trigger historisation des modifications sur une base de données
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
#6 04/02/2011 12:34:41
- gleu
- Administrateur
Re : trigger historisation des modifications sur une base de données
Oui, tg_table_name est la bonne variable.
Guillaume.
Hors ligne
#7 07/02/2011 12:07:10
- chris0938
- Membre
Re : trigger historisation des modifications sur une base de données
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
#8 07/02/2011 12:25:55
- gleu
- Administrateur
Re : trigger historisation des modifications sur une base de données
Oui. C'est dispo qu'à partir de la version 9.0.
Guillaume.
Hors ligne
#9 07/02/2011 12:43:48
- chris0938
- Membre
Re : trigger historisation des modifications sur une base de données
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
#10 07/02/2011 14:47:13
- chris0938
- Membre
Re : trigger historisation des modifications sur une base de données
je viens de trouver. je dois utiliser new.id ou old.id selon le cas.
merci
Hors ligne
#11 07/02/2011 14:57:07
- gleu
- Administrateur
Re : trigger historisation des modifications sur une base de données
Exact.
Guillaume.
Hors ligne
#12 07/02/2011 15:10:31
- chris0938
- Membre
Re : trigger historisation des modifications sur une base de données
merci beaucoup pour votre aide.
Hors ligne