活动查询使用的ALTER TABLE

时间:2018-01-10 22:39:52

标签: postgresql

我有一个简单的函数来硬删除表中的行,这些行通常具有阻止删除的触发器。

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

1 个答案:

答案 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;

再一次,我有点吐痰。如果你问过我的功能是否可以按原样运行,我的猜测就是"是的。"