205 votes

Comment désactiver temporairement 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 ?

8voto

Samih Chouhen Points 81
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');

4voto

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.com

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.

Powered by:

X