Estou carregando dados em massa e posso recalcular todas as modificações de gatilho muito mais baratas após o fato do que em uma linha por linha.
Como posso desativar temporariamente todos os gatilhos no PostgreSQL?
Estou carregando dados em massa e posso recalcular todas as modificações de gatilho muito mais baratas após o fato do que em uma linha por linha.
Como posso desativar temporariamente todos os gatilhos no PostgreSQL?
Respostas:
Como alternativa, se você deseja desativar todos os gatilhos, não apenas os da tabela USER, você pode usar:
SET session_replication_role = replica;
Isso desativa os gatilhos para a sessão atual.
Para reativar a mesma sessão:
SET session_replication_role = DEFAULT;
Fonte: http://koo.fi/blog/2013/01/08/disable-postgresql-triggers-temporariamente/
ENABLE REPLICA
ou ENABLE ALWAYS
.
10.4
e parece ignorar esta afirmação acima.
O PostgreSQL conhece o ALTER TABLE tblname DISABLE TRIGGER USER
comando, que parece fazer o que eu preciso. Veja ALTER TABLE .
ALTER TABLE ... DISABLE TRIGGER USER
requer um bloqueio exclusivo na mesa.
Para desativar o gatilho
ALTER TABLE table_name DISABLE TRIGGER trigger_name
Para ativar gatilho
ALTER TABLE table_name ENABLE TRIGGER trigger_name
ALTER TABLE table_name DISABLE TRIGGER all
SET session_replication_role = replica;
Ele não funciona com o PostgreSQL 9.4 na minha máquina Linux se eu alterar uma tabela através do editor de tabelas no pgAdmin e funciona se eu alterar a tabela através de consultas comuns. Alterações manuais na tabela pg_trigger também não funcionam sem a reinicialização do servidor, mas consultas dinâmicas como postgresql.nabble.com FUNCIONAM / DESATIVAM TODOS OS TRIGGERS NO DATABASE . Pode ser útil quando você precisar de algum ajuste.
Por exemplo, se você possui tabelas em um espaço para nome específico, pode ser:
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;
Se você deseja desativar todos os gatilhos com determinada função de gatilho, pode ser:
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;
Documentação do PostgreSQL para catálogos de sistemas
Existem outras opções de controle do processo de disparo de gatilho:
ALTER TABLE ... HABILITAR O REPLICA TRIGGER ... - o gatilho será acionado apenas no modo de réplica.
ALTER TABLE ... HABILITAR SEMPRE O TRIGGER ... - o gatilho sempre dispara (obviamente)
Você também pode desativar os gatilhos no pgAdmin (III):
SET session_replication_role = replica;
também funciona para mim no Postgres 9.1. Eu uso as duas funções descritas por Bartolo-Otrit com algumas modificações. Modifiquei a primeira função para fazê-la funcionar para mim porque o espaço para nome ou o esquema deve estar presente para identificar a tabela corretamente. O novo código é:
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;
então eu simplesmente faço uma consulta de seleção para cada esquema:
SELECT disable_triggers(true,'public');
SELECT disable_triggers(true,'Adempiere');