Answers:
另外,如果您想禁用所有触发器,而不仅仅是禁用USER表上的触发器,则可以使用:
SET session_replication_role = replica;
这将禁用当前会话的触发器。
要为同一会话重新启用:
SET session_replication_role = DEFAULT;
来源:http : //koo.fi/blog/2013/01/08/disable-postgresql-triggers-temporarily/
10.4
似乎忽略了以上声明。
PostgreSQL知道ALTER TABLE tblname DISABLE TRIGGER USER
命令,这似乎可以满足我的要求。请参阅ALTER TABLE。
ALTER TABLE ... DISABLE TRIGGER USER
需要在表上具有排他锁。
对于禁用触发器
ALTER TABLE table_name DISABLE TRIGGER trigger_name
对于启用触发器
ALTER TABLE table_name ENABLE TRIGGER trigger_name
ALTER TABLE table_name DISABLE TRIGGER all
SET session_replication_role = replica;
如果我通过pgAdmin中的表编辑器更改表,则无法与Linux机器上的PostgreSQL 9.4一起使用;如果我通过普通查询更改表,则该方法无法使用。如果不重新启动服务器,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文档
触发器触发过程还有另一个控制选项:
ALTER TABLE ... ENABLE REPLICA TRIGGER ...-触发器仅在复制模式下触发。
ALTER TABLE ...始终启用触发器...-触发器将始终触发(显然)
SET session_replication_role = replica;
在Postgres 9.1中也对我有用。我使用bartolo-otrit描述的两个功能,并进行了一些修改。我修改了第一个函数以使其对我有用,因为必须存在名称空间或架构才能正确识别表。新的代码是:
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 disable_triggers(true,'public');
SELECT disable_triggers(true,'Adempiere');