我有一个简单的函数来硬删除表中的行,这些行通常具有阻止删除的触发器。
CREATE OR REPLACE FUNCTION hard_delete_events (event_ids int[])
RETURNS void
AS $$
BEGIN
ALTER TABLE events DISABLE TRIGGER USER;
DELETE FROM events e WHERE e.id = ANY($1);
ALTER TABLE events ENABLE TRIGGER USER;
END;
$$ LANGUAGE plpgsql;
运行该功能时出现错误:
ERROR: cannot ALTER TABLE "events" because it is being used by active queries in this session
我知道唯一的会话活动查询是运行函数本身。
有任何建议可以解决这个问题吗?
Postres 9.6
答案 0 :(得分:0)
我认为PostgreSQL中的函数允许使用DML,所以这对我来说是一个惊喜。
老实说,我并非100%确定这会有效,但似乎可能。如果您将外部数据包装器创建回服务器,如下所示:
CREATE SERVER pgprod
FOREIGN DATA WRAPPER dblink_fdw
OPTIONS (dbname 'postgres', host 'localhost', port '5432');
然后也许你可以改变你的功能来执行FDW调用以伪造数据库:
CREATE OR REPLACE FUNCTION hard_delete_events (event_ids int[])
RETURNS void
AS $$
BEGIN
perform dblink_exec('pgprod',
'ALTER TABLE events DISABLE TRIGGER USER;'
);
DELETE FROM events e WHERE e.id = ANY($1);
perform dblink_exec('pgprod',
'ALTER TABLE events ENABLE TRIGGER USER;'
);
END;
$$ LANGUAGE plpgsql;
再一次,我有点吐痰。如果你问过我的功能是否可以按原样运行,我的猜测就是"是的。"