Je charge des données en masse et je peux recalculer toutes les modifications des déclencheurs à un coût bien moindre après coup que sur une base ligne par ligne.
Comment puis-je désactiver temporairement tous les déclencheurs dans PostgreSQL ?
Je charge des données en masse et je peux recalculer toutes les modifications des déclencheurs à un coût bien moindre après coup que sur une base ligne par ligne.
Comment puis-je désactiver temporairement tous les déclencheurs dans PostgreSQL ?
SET session_replication_role = replica;
ne fonctionne pas non plus pour moi avec Postgres 9.1. J'utilise les deux fonctions décrites par Bartolo-otrit avec quelques modifications. J'ai modifié la première fonction pour qu'elle fonctionne pour moi car l'espace de noms ou le schéma doit être présent pour identifier la table correctement. Le nouveau code est le suivant :
CREATE OR REPLACE FUNCTION disable_triggers(a boolean, nsp character varying)
RETURNS void AS
$BODY$
declare
act character varying;
r record;
begin
if(a is true) then
act = 'disable';
else
act = 'enable';
end if;
for r in select c.relname from pg_namespace n
join pg_class c on c.relnamespace = n.oid and c.relhastriggers = true
where n.nspname = nsp
loop
execute format('alter table %I.%I %s trigger all', nsp,r.relname, act);
end loop;
end;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION disable_triggers(boolean, character varying)
OWNER TO postgres;
Ensuite, je fais simplement une requête de sélection pour chaque schéma :
SELECT disable_triggers(true,'public');
SELECT disable_triggers(true,'Adempiere');
Une façon très élégante de gérer cela est de créer un rôle qui gère la population de la base de données et de définir la réplication pour ce rôle :
ALTER ROLE role_name SET session_replication_role = 'replica';
De cette façon, vous pouvez utiliser ce rôle pour alimenter les données sans avoir à vous soucier de désactiver et de réactiver les déclencheurs, etc.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.