web-dev-qa-db-fra.com

Comment désactiver temporairement les déclencheurs dans PostgreSQL?

Je charge en masse des données et je peux re-calculer toutes les modifications de déclenchement beaucoup moins cher par la suite que sur une base ligne par ligne.

Comment puis-je désactiver temporairement tous les déclencheurs dans PostgreSQL?

110
David Schmitt

PostgreSQL connaît le ALTER TABLE tblname DISABLE TRIGGER USER commande, qui semble faire ce dont j'ai besoin. Voir ALTER TABLE .

109
David Schmitt

Si vous souhaitez désactiver tous les déclencheurs, et pas seulement ceux de la table USER, vous pouvez également utiliser:

SET session_replication_role = replica;

Cela désactive les déclencheurs pour la session en cours.

Pour réactiver la même session:

SET session_replication_role = DEFAULT;

Source: http://koo.fi/blog/2013/01/08/disable-postgresql-triggers-temporarily/

136
zyzof

Pour désactiver le déclencheur

ALTER TABLE table_name DISABLE TRIGGER trigger_name

Pour activer le déclencheur

ALTER TABLE table_name ENABLE TRIGGER trigger_name
27
Mise

Vous pouvez également désactiver les déclencheurs dans pgAdmin (III):

  1. Trouvez votre table
  2. Développer le +
  3. Trouvez votre déclencheur dans Triggers
  4. Cliquez avec le bouton droit de la souris, décochez la case "Déclencheur activé?"
6
Neil McGuigan
SET session_replication_role = replica; 

Cela ne fonctionne pas avec PostgreSQL 9.4 sur ma machine Linux si je modifie une table via l'éditeur de table dans pgAdmin et fonctionne si je change de table via une requête ordinaire. Les modifications manuelles dans la table pg_trigger ne fonctionnent pas non plus sans redémarrage du serveur, mais une requête dynamique comme sur postgresql.nabble.com ACTIVER/DÉSACTIVER TOUS LES DÉCLENCHEMENTS DE LA BASE DE DONNÉES fonctionne. Cela peut être utile lorsque vous avez besoin de réglages.

Par exemple, si vous avez des tables dans un espace de noms particulier, cela peut être:

create or replace function disable_triggers(a boolean, nsp character varying) returns void as
$$
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 %s trigger all', r.relname, act); 
    end loop;
end;
$$
language plpgsql;

Si vous souhaitez désactiver tous les déclencheurs dotés de certaines fonctions, vous pouvez:

create or replace function disable_trigger_func(a boolean, f character varying) returns void as
$$
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_proc p 
        join pg_trigger t on t.tgfoid = p.oid
        join pg_class c on c.oid = t.tgrelid
        where p.proname = f
    loop
        execute format('alter table %I %s trigger all', r.relname, act); 
    end loop;
end;
$$
language plpgsql;

Documentation PostgreSQL pour catalogues système


Il existe d'autres options de contrôle du processus d'activation de la gâchette:

ALTER TABLE ... ENABLE REPLICA TRIGGER ... - le déclencheur se déclenche en mode réplique uniquement.

ALTER TABLE ... ACTIVEZ TOUJOURS LA GÂCHETTE ... - la gâchette déclenchera toujours (évidemment)

5
bartolo-otrit
SET session_replication_role = replica;  

aussi dosent travail pour moi dans 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 correctement car l'espace de noms ou le schéma doit être présent pour identifier correctement la table. Le nouveau code est:

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;

alors je fais simplement une requête de sélection pour chaque schéma:

SELECT disable_triggers(true,'public');
SELECT disable_triggers(true,'Adempiere');
3
Samih Chouhen