禁用PostgreSQL中的自动提交以创建触发器

时间:2014-03-29 18:08:13

标签: database postgresql triggers plpgsql quotes

我试图在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;

但每次运行时连接都会关闭。

1 个答案:

答案 0 :(得分:3)

这可能是一种误解。 Autocommit似乎不是问题所在。

函数体是字符串,您需要引用它。通常,您会使用dollar-quoting来简化您的工作:

CREATE FUNCTION test_trigger()
RETURNS trigger AS
$func$
BEGIN
IF () THEN INSERT INTO...;
ELSEIF ()...;
...
...
END IF;
RETURN NULL;
END
$func$ LANGUAGE plpgsql;

除此之外,去"禁用" autocommit,start a transaction。这就是你最后一行中建议的解决方案的目标:

BEGIN;               -- starts transaction
UPDATE tbl ...;      -- not commited yet
CREATE FUNCTION ...; -- not commited yet
COMMIT;              -- *now* we commit