我试图在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;
但每次运行时连接都会关闭。
答案 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