【问题标题】:Disable Autocommit in PostgreSQL to Create a Trigger在 PostgreSQL 中禁用自动提交以创建触发器
【发布时间】:2014-03-29 18:08:12
【问题描述】:

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

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

【问题讨论】:

    标签: database postgresql triggers plpgsql quotes


    【解决方案1】:

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

    函数体是一个字符串,你需要引用它。通常你会使用dollar-quoting 让你的生活更轻松:

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

    除此之外,要“禁用”自动提交,start a transaction。这就是您最后一行中建议的解决方案的目标:

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

    【讨论】:

    • 所以我必须将这两个部分结合起来?请查看我更新的帖子
    • @Oxi:如前所述,我认为自动提交根本不是问题。只需修复 create function 语句。并且您不能在函数体中启动/停止事务。函数始终是原子的。
    • 我按照你提到的(在帖子中)修复了它,但每次运行命令时连接都会关闭。
    • @Oxi:同样的错误信息?为您的问题添加更多信息。 (不只是在 cmets 中。)你如何连接?你的客户是什么?您确切的 Postgres 版本?函数是否被创建?您的数据库日志中有什么?
    • 我发布了另一个更详细的问题。请你检查一下。 stackoverflow.com/questions/22747225/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    相关资源
    最近更新 更多