Как временно отключить триггеры в PostgreSQL?



Я массово загружаю данные и могу пересчитать все модификации триггера намного дешевле после факта, чем на основе строки за строкой.



Как я могу временно отключить все триггеры в PostgreSQL?

922   6  

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):

  1. Найди свой столик
  2. разверните +
  3. найти свой триггер триггеры
  4. щелкните правой кнопкой мыши, снимите флажок "запуск позволяет?"
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

    Ничего не найдено.