如何在PostgreSQL中暂时禁用触发器?
我是批量加载数据,并且可以在事后比在逐行的基础上更便宜地重新计算所有的触发器修改。
我怎样才能暂时禁用PostgreSQL中的所有触发器?
或者,如果要禁用所有触发器,而不仅仅是USER表中的那些触发器,则可以使用:
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 。
您也可以在pgAdmin(III)中禁用触发器:
- find你的桌子
- 展开+
- 在触发器中find你的触发器
- 右键单击,取消选中“启用触发器?”
SET session_replication_role = replica;
它不适用于我的Linux机器上的PostgreSQL 9.4,如果我通过pgAdmin中的表编辑器更改表,并工作,如果我通过普通的查询更改表。 pg_trigger表中的手动更改也不能在没有服务器重新启动的情况下工作,但像postgresql.nabble.com上的dynamic查询在数据库中的ENABLE / DISABLE ALL TRIGGERS工作。 当你需要一些调整时,它可能是有用的。
例如,如果你在特定的命名空间中有表,它可能是:
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;
如果要禁用具有某些触发器function的所有触发器,可能是:
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 … – 触发器将仅以复制模式触发。
改变表…启用总是触发… – 触发器将始终(明显)
SET session_replication_role = replica;
在Postgres 9.1中也是一样的。 我使用bartolo-otrit所描述的两个function进行了一些修改。 我修改了第一个函数,使其适用于我,因为名称空间或模式必须存在才能正确识别表。 新的代码是:
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');
用于禁用触发器
ALTER TABLE table_name DISABLE TRIGGER trigger_name
用于启用触发器
ALTER TABLE table_name ENABLE TRIGGER trigger_name