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 ?
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/
PostgreSQL connaît l'option ALTER TABLE tblname DISABLE TRIGGER USER
qui semble faire ce dont j'ai besoin. Voir aussi ALTER TABLE .
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)
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.