我批量加载数据,可以重新计算所有触发修改后,比按行计算更便宜。
如何暂时禁用PostgreSQL中的所有触发器?
我批量加载数据,可以重新计算所有触发修改后,比按行计算更便宜。
如何暂时禁用PostgreSQL中的所有触发器?
当前回答
PostgreSQL知道ALTER TABLE tblname DISABLE TRIGGER USER命令,这似乎是我所需要的。参见ALTER TABLE。
其他回答
PostgreSQL知道ALTER TABLE tblname DISABLE TRIGGER USER命令,这似乎是我所需要的。参见ALTER TABLE。
你也可以禁用pgAdmin (III)中的触发器:
找到你的座位 展开+ 在触发器中找到你的触发器 右键单击,取消勾选“已启用触发器?”
SET session_replication_role = replica;
如果我通过pgAdmin中的表编辑器更改表,它不与PostgreSQL 9.4在我的Linux机器上工作,如果我通过普通查询更改表。手动修改pg_trigger表也不能在没有服务器重启的情况下工作,但动态查询如postgresql.nabble.com ENABLE / DISABLE ALL TRIGGERS in DATABASE工作。当您需要进行一些调优时,它可能会很有用。
例如,如果你在一个特定的命名空间中有表,它可以是:
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文档
触发点火过程还有其他控制选项:
修改表…启用复制触发器…- trigger将只在复制模式下触发。
修改表…启用总是触发…触发器会一直触发(很明显)
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查询:
SELECT disable_triggers(true,'public');
SELECT disable_triggers(true,'Adempiere');
或者,如果你想禁用所有触发器,而不仅仅是USER表上的触发器,你可以使用:
SET session_replication_role = replica;
这将禁用当前会话的触发器。
为同一会话重新启用:
SET session_replication_role = DEFAULT;
来源:http://koo.fi/blog/2013/01/08/disable-postgresql-triggers-temporarily/