database - 在 PostgreSQL 中禁用自动提交以创建触发器

标签 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;

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

最佳答案

这可能是个误会。自动提交似乎不是问题所在。

函数体是一个字符串,需要引用。通常你会使用 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/

相关文章:

无法将 C 程序编译为 PostgreSQL 存储过程

MySQL - 触发器 - 插入之前和使用 SK(自动增量)

mongodb - 是否可以通过collection.insert()在meteor中添加多个文档?

database - 磁盘性能上的持久性(纯功能性)红黑树

mysql - 如何设置事务隔离级别(MySQL)

javascript - 如何检查Google表格上是否添加了新数据

postgresql - Postgresql CHECK IN 列表约束的自定义错误消息

c# - Linq to sql - 数据库不会更新

sql - 如何创建一个聚合函数来返回最后n条记录?

postgresql - postgres - 将列转置为行