6 ответов:
кроме того, если вы хотите отключить все триггеры, а не только те, которые находятся в таблице пользователей, вы можете использовать:
SET session_replication_role = replica;это отключает триггеры для текущего сеанса.
для повторного включения для того же сеанса:
SET session_replication_role = DEFAULT;источник: http://koo.fi/blog/2013/01/08/disable-postgresql-triggers-temporarily/
PostgreSQL знает
ALTER TABLE tblname DISABLE TRIGGER USERкоманда, которая, кажется, делает то, что мне нужно. Смотрите ALTER TABLE.
для отключения триггера
ALTER TABLE table_name DISABLE TRIGGER trigger_nameвключить триггер
ALTER TABLE table_name ENABLE TRIGGER trigger_name
вы также можете отключить триггеры в pgAdmin (III):
- Найди свой столик
- разверните +
- найти свой триггер триггеры
- щелкните правой кнопкой мыши, снимите флажок "запуск позволяет?"
SET session_replication_role = replica;Он не работает с PostgreSQL 9.4 на моей машине Linux, если я изменяю таблицу через редактор таблиц в pgAdmin и работает, если я изменяю таблицу через обычный запрос. Ручные изменения в таблице pg_trigger также не работают без перезагрузки сервера, но динамический запрос, как на postgresql.nabble.com включить / отключить все триггеры в базе данных строительство. Это может быть полезно, когда вам нужна некоторая настройка.
например, если у вас есть таблицы в определенном пространстве имен, это может быть:
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 для система каталогов
есть и другие варианты управления процессом запуска триггера:
ИЗМЕНИТЬ ТАБЛИЦУ ... ВКЛЮЧИТЬ ТРИГГЕР РЕПЛИКИ ... - триггер будет срабатывать только в режиме реплики.
ИЗМЕНИТЬ ТАБЛИЦУ ... ВОЗМОЖНОСТЬ ВСЕГДА ВЫЗВАТЬ ... - триггер будет стрелять всегда (очевидно)
SET session_replication_role = replica;также dosent работает для меня в Postgres 9.1. я использую две функции, описанные Бартоло-отритом с некоторой модификацией. Я изменил первую функцию, чтобы она работала для меня, потому что пространство имен или схема должны присутствовать, чтобы правильно идентифицировать таблицу. Новый код :
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;тогда я просто делаю запрос SELECT для каждой схемы :
SELECT disable_triggers(true,'public'); SELECT disable_triggers(true,'Adempiere');
Comments