gpt4 book ai didi

postgresql - 事件查询使用的 ALTER TABLE

转载 作者:行者123 更新时间:2023-11-29 13:46:10 26 4
gpt4 key购买 nike

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

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

而且我知道唯一的 session 事件查询正在运行函数本身。

有什么处理这个问题的建议吗?

帖子 9.6

最佳答案

我认为 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;

再一次,我有点吐了。如果您问我您的功能是否可以按原样运行,我的猜测是“可以”。

关于postgresql - 事件查询使用的 ALTER TABLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48197258/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com