PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#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

Pied de page des forums