我正在处理应用数据库架构更新的脚本。我使用start transaction / commit设置了所有SQL更新脚本。我在命令行上将这些脚本传递给psql。

我现在需要在一次交易中同时应用多个脚本。到目前为止,我提出的唯一解决方案是从原始脚本集中删除启动事务/提交,然后在新的启动事务/提交块中将它们一起阻塞。我正在编写perl脚本来动态执行此操作。

实际上我想要嵌套事务,我无法弄清楚如何在postgresql中做。

为此目的,有没有办法做或模拟嵌套事务?我有一些设置可以自动解决任何错误,所以如果任何较低的错误失败,我不需要继续进行顶级交易。

有帮助吗?

解决方案

您可以使用SavePoints在postgresql中使用嵌套事务。

以此代码示例:

CREATE TABLE t1 (a integer PRIMARY KEY);

CREATE FUNCTION test_exception() RETURNS boolean LANGUAGE plpgsql AS
$BEGIN
   INSERT INTO t1 (a) VALUES (1);
   INSERT INTO t1 (a) VALUES (2);
   INSERT INTO t1 (a) VALUES (1);
   INSERT INTO t1 (a) VALUES (3);
   RETURN TRUE;
EXCEPTION
   WHEN integrity_constraint_violation THEN
      RAISE NOTICE 'Rollback to savepoint';
      RETURN FALSE;
END;$;

BEGIN;

SELECT test_exception();
NOTICE:  Rollback to savepoint
 test_exception 
----------------
 f
(1 row)

COMMIT;

SELECT count(*) FROM t1;
 count 
-------
     0
(1 row)

也许这会帮助你一点点。

其他提示

我最终在带外“解决”我的问题 - 我使用perl脚本重新处理输入脚本以消除它们的启动事务/提交调用,然后将它们全部推送到一个文件中,这样就可以获得它启动事务/提交。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top