SET session_replication_role = replica;
Он не работает с PostgreSQL 9.4 на моем компьютере с Linux, если я изменяю таблицу через редактор таблиц в pgAdmin, и работает, если я изменяю таблицу с помощью обычного запроса. Ручные изменения в таблице pg_trigger также не работают без перезапуска сервера, но работает динамический запрос, как на postgresql.nabble.com ВКЛЮЧИТЬ / ОТКЛЮЧИТЬ ВСЕ TRIGGERS В БАЗЕ ДАННЫХ Это может быть полезно, когда вам нужно немного настроить.
Например, если у вас есть таблицы в определенном пространстве имен, это может быть:
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;
Если вы хотите отключить все триггеры с определенной функцией триггера, это может быть:
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;
Документация PostgreSQL для системных каталогов
Существуют и другие варианты управления процессом срабатывания триггера:
ALTER TABLE ... ENABLE REPLICA TRIGGER ... - триггер сработает только в режиме реплики.
ALTER TABLE ... ВКЛЮЧИТЬ ВСЕГДА, ТРИГГЕР ... - триггер срабатывает всегда (очевидно)