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 ?

245voto

zyzof Points 259

Par ailleurs, si vous souhaitez désactiver tous les déclencheurs, et pas seulement ceux de la table USER, vous pouvez 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/

159voto

David Schmitt Points 29384

PostgreSQL connaît l'option ALTER TABLE tblname DISABLE TRIGGER USER qui semble faire ce dont j'ai besoin. Voir aussi ALTER TABLE .

95voto

J4M0 Points 45

Pour désactiver le déclenchement

ALTER TABLE table_name DISABLE TRIGGER trigger_name

Pour activer le déclenchement

ALTER TABLE table_name ENABLE TRIGGER trigger_name

10voto

vaychick Points 659
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 modifie une table via une requête ordinaire. Les changements manuels dans la table pg_trigger ne fonctionnent pas non plus sans un redémarrage du serveur mais les requêtes dynamiques comme sur postgresql.nabble.com ENABLE / DISABLE ALL TRIGGERS IN DATABASE (activer / désactiver tous les déclencheurs de la base de données) œuvre. Cela peut être utile lorsque vous avez besoin d'une mise au point.

Par exemple, si vous avez des tables dans un espace de noms particulier, cela pourrait ê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 voulez désactiver tous les déclencheurs avec une certaine fonction de déclenchement, c'est possible :

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 de systèmes


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

MODIFIER LA TABLE ... ENABLE REPLICA TRIGGER ... - le trigger se déclenchera uniquement en mode réplique.

MODIFIER LA TABLE ... ENABLE ALWAYS TRIGGER ... - le trigger se déclenchera toujours (évidemment)

8voto

Neil McGuigan Points 10123

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

  1. Trouvez votre table
  2. Élargir le +
  3. Trouvez votre déclencheur dans Déclencheurs
  4. Cliquez avec le bouton droit de la souris, décochez la case "Déclencheur activé ?".

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