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

Je charge des données en vrac et je peux recalculer toutes les modifications du déclencheur beaucoup plus facilement après coup que sur une base de ligne en ligne.

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

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 pour la même session:

 SET session_replication_role = DEFAULT; 

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

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

Pour désactiver le déclencheur

 ALTER TABLE table_name DISABLE TRIGGER sortinggger_name 

Pour activer le déclencheur

 ALTER TABLE table_name ENABLE TRIGGER sortinggger_name 

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

  1. Trouvez votre table
  2. Développez le +
  3. Trouvez votre déclencheur dans les déclencheurs
  4. Cliquez avec le bouton droit de la souris, décochez la case “Trigger Enabled?”
 SET session_replication_role = replica; 

Il ne fonctionne pas avec PostgreSQL 9.4 sur ma machine Linux si je change une table via l’éditeur de table dans pgAdmin et fonctionne si je change de table par une requête ordinaire. Les modifications manuelles dans la table pg_sortinggger ne fonctionnent pas non plus sans redémarrage du serveur, mais la requête dynamic comme sur postgresql.nabble.com permet de faire fonctionner tous les déclencheurs dans la firebase database. Cela peut être utile lorsque vous avez besoin de réglage.

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

 create or replace function disable_sortingggers(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.relhassortingggers = true where n.nspname = nsp loop execute format('alter table %I %s sortinggger all', r.relname, act); end loop; end; $$ language plpgsql; 

Si vous souhaitez désactiver tous les déclencheurs avec certaines fonctions de déclenchement, cela peut être:

 create or replace function disable_sortinggger_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_sortinggger 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 sortinggger all', r.relname, act); end loop; end; $$ language plpgsql; 

Documentation PostgreSQL pour les catalogues système


Il existe d’autres options de contrôle du processus de déclenchement du déclencheur:

ALTER TABLE … ENABLE REPLICA TRIGGER … – le déclencheur ne se déclenche qu’en mode réplique.

ALTER TABLE … ACTIVER TOUJOURS TRIGGER … – le déclenchement se déclenche toujours (évidemment)

 SET session_replication_role = replica; 

Je travaille aussi pour moi dans Postgres 9.1. J’utilise les deux fonctions décrites par bartolo-osortingt avec quelques modifications. J’ai modifié la première fonction pour la faire fonctionner car l’espace de noms ou le schéma doit être présent pour identifier correctement la table. Le nouveau code est le suivant:

 CREATE OR REPLACE FUNCTION disable_sortingggers(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.relhassortingggers = true where n.nspname = nsp loop execute format('alter table %I.%I %s sortinggger all', nsp,r.relname, act); end loop; end; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION disable_sortingggers(boolean, character varying) OWNER TO postgres; 

alors je fais simplement une requête select pour chaque schéma:

 SELECT disable_sortingggers(true,'public'); SELECT disable_sortingggers(true,'Adempiere');