我批量加载数据,可以重新计算所有触发修改后,比按行计算更便宜。

如何暂时禁用PostgreSQL中的所有触发器?


当前回答

或者,如果你想禁用所有触发器,而不仅仅是USER表上的触发器,你可以使用:

SET session_replication_role = replica;

这将禁用当前会话的触发器。

为同一会话重新启用:

SET session_replication_role = DEFAULT;

来源:http://koo.fi/blog/2013/01/08/disable-postgresql-triggers-temporarily/

其他回答

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');

PostgreSQL知道ALTER TABLE tblname DISABLE TRIGGER USER命令,这似乎是我所需要的。参见ALTER TABLE。

一个非常优雅的处理方法是创建一个处理数据库填充的角色,并为该角色设置复制:

ALTER ROLE role_name SET session_replication_role = 'replica';

这样你就可以使用这个角色来填充数据,而不必担心禁用和重新启用触发器等。

或者,如果你想禁用所有触发器,而不仅仅是USER表上的触发器,你可以使用:

SET session_replication_role = replica;

这将禁用当前会话的触发器。

为同一会话重新启用:

SET session_replication_role = DEFAULT;

来源:http://koo.fi/blog/2013/01/08/disable-postgresql-triggers-temporarily/

你也可以禁用pgAdmin (III)中的触发器:

找到你的座位 展开+ 在触发器中找到你的触发器 右键单击,取消勾选“已启用触发器?”