我尝试在 PostgreSQL 9.1 数据库中编写一个触发器,类似于:
CREATE FUNCTION test_trigger()
RETURNS trigger AS
BEGIN
IF () THEN INSERT INTO...;
ELSEIF ()...;
...
...
END IF;
RETURN NULL;
END
然后我得到这个错误:
Cannot commit when autoCommit is enabled error
所以我尝试使用 set autocommit=off;
禁用它,但随后收到此消息:
ERROR: SET AUTOCOMMIT TO OFF is no longer supported
一个建议的解决方案是使用 BEGIN
开始交易,但我不知道如何编辑我的触发函数来做到这一点。
更新
我试过这个来禁用触发器创建的自动提交,如下所示:
BEGIN;
CREATE FUNCTION test_trigger()
RETURNS trigger AS
$func$
BEGIN
IF () THEN INSERT INTO...;
ELSEIF ()...;
...
...
END IF;
RETURN NULL;
END
COMMIT;
$func$
LANGUAGE plpgsql;
但每次我运行它时连接都会关闭。
最佳答案
这可能是个误会。自动提交似乎不是问题所在。
函数体是一个字符串,需要引用。通常你会使用 dollar-quoting让您的生活更轻松:
CREATE FUNCTION test_trigger()
RETURNS trigger AS
<b>$func$</b>
BEGIN
IF () THEN INSERT INTO...;
ELSEIF ()...;
...
...
END IF;
RETURN NULL;
END
<b>$func$</b> LANGUAGE plpgsql;
除此之外,要“禁用”自动提交,start a transaction .这就是您最后一行中建议的解决方案的目的:
BEGIN; -- starts transaction
UPDATE tbl ...; -- not commited yet
CREATE FUNCTION ...; -- not commited yet
COMMIT; -- *now* we commit
关于database - 在 PostgreSQL 中禁用自动提交以创建触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22734814/