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 24/06/2009 15:05:38

Haseo
Membre

pg_dump / pg_restore et triggers

Bonjour,

Je cherche l'option qui a la fin d'une restauration active tous les triggers présents sur toutes les tables restaurées.
J'utilise pg_dump / pg_restore avec l'option clean et l'utilisateur postgres pour le faire.

Dans la doc rien n'est mentionné (j'ai pas trouvé) et même en utilisant l'option -X disable-triggers les triggers ne sont pas activés.

Pour info, j'utilise une version 8.3 recompilée sous Solaris 5.10.

Hors ligne

#2 24/06/2009 15:18:19

gleu
Administrateur

Re : pg_dump / pg_restore et triggers

Les triggers sont toujours activés, sauf dans le cas de l'utilisation de l'option --disable-triggers. Et même dans ce cas, ils sont activés une fois la restauration terminée.


Guillaume.

Hors ligne

#3 24/06/2009 15:30:07

Haseo
Membre

Re : pg_dump / pg_restore et triggers

Il faut croire que non, j'en ai fait l'expérience suite à une remarque d'un utilisateur.

Dans la base d'origine, les triggers sont activées après réplication sur le serveur de pré-prod, ils sont tous désactivés : ca pose problème puisque l'intégrité des données filtré par ces triggers n'est plus respecté.

Comme dit plus haut, j'ai essayé avec et sans l'option disable-triggers. Cela ne change rien, avec l'option -clean ca va être difficile de désactiver quelque chose qui n'existe plus au moment de la restauration.

edit : cela a un p-e un lien mais la version de pg_dump et en 8.1 et la base en 8.3 et je suis oligé d'ajouter l'option ignore pour réaliser le dump.

Dernière modification par Haseo (24/06/2009 15:36:43)

Hors ligne

#4 24/06/2009 15:40:27

gleu
Administrateur

Re : pg_dump / pg_restore et triggers

Donc vous avez un peu oublié d'expliquer le contexte. Vous sauvegardez une base à partir d'un esclave Slony. Je me trompe ?

Si j'ai raison, le problème ne vient pas de PostgreSQL, mais du fait que Slony a désactivé les triggers présents sur les tables. Pour les réactiver, c'est un peu plus complexe. Vous avez quelques détails sur http://www.slony.info/documentation/triggers.html. Quelle version avez-vous de Slony et de PostgreSQL ?


Guillaume.

Hors ligne

#5 24/06/2009 16:22:19

Haseo
Membre

Re : pg_dump / pg_restore et triggers

Mon problème est un peu confus. Je vais tout ré-expliquer depuis le début.

J'ai 2 environnements différents : la production et la pré-production.
Sur demande, je réalise des dump et des restauration en fonction des besoins de chacun.

Voici les commandes que j'utilise :
pour le dump : pg_dump -i -h [adresseprod] -U [utilisateur] -F c [mabase] -f [monarchivecompressée]

pour la restauration : pg_restore -i -c [monarchivecompressée] -f  [fichier.sql]

et je lance la restauration par psql -U postgres -d [basecible] -f [fichier.sql]

La restauration se passe sans problème (pas d'erreurs ds les logs) sauf qu'à la fin aucun triggers n'est activé.

Je cherche un moyen de les réactivers dans l'ensemble, sinon, je vais devoir faire un script ou une fonction qui réactive tous les triggers présents dans la base.

p.s : Slony  n'intervient pas dans la réplication.

Je te remercie pour tes réponses.

Hors ligne

#6 24/06/2009 16:49:53

gleu
Administrateur

Re : pg_dump / pg_restore et triggers

Le seul moyen de désactiver un trigger est d'utiliser la commande ALTER TABLE DISABLE TRIGGER, disponible en 8.3. Vérifiez qu'un ALTER TABLE ENABLE TRIGGER le réactive, mais j'avoue que je suis perplexe.


Guillaume.

Hors ligne

#7 24/06/2009 17:42:47

Haseo
Membre

Re : pg_dump / pg_restore et triggers

Les triggers existent bien dans la base de pé-prod puisque sous pgadmin un "activer tous les triggers sur cette table" fonctionne.
P-e suis je tombé sur un bug... toujours est il qu'au lieu de chercher encore pendant 3 heures, voici une fonction qui active tous les triggers présents dans une base.
Testée et approuvée wink .

create or replace function public.f_enable_all_triggers()
returns integer as
$$
declare
l record;
requete character varying;
nbt integer;

begin
nbt := 0;

for l in select trigger_schema, trigger_name, event_object_table 
	from information_schema.triggers where trigger_schema != 'pg_catalog' loop

	requete := 'alter table ' || l.trigger_schema || '.' || l.event_object_table;
	requete := requete || ' enable trigger ' || l.trigger_name || ';';

	raise notice '%', requete;

	execute requete;
	
	nbt := nbt + 1;
	
end loop;

return nbt;

end;

$$
LANGUAGE 'plpgsql' VOLATILE
  COST 100;

Hors ligne

#8 24/06/2009 18:55:20

gleu
Administrateur

Re : pg_dump / pg_restore et triggers

Reste à savoir comment ils ont été désactivés. Et clairement, ce n'est pas la cause de pg_dump/pg_restore. Ne serait-il pas déjà désactivés sur le serveur où vous avez fait le pg_dump ?


Guillaume.

Hors ligne

#9 25/06/2009 14:11:10

Haseo
Membre

Re : pg_dump / pg_restore et triggers

Sur la base dumpée, les triggers sont bel et bien tous activés.
Il me semble être tombé au détour de la doc, qu'une variable existe dans la configuration pour dire d'activer ou de désactiver les triggers lors d'une restauration. Mais comme souvent, c'est toujours quand on cherche qu'on trouve pas.

Hors ligne

Pied de page des forums