我正在研究应用数据库架构更新的脚本。我已经使用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)
也许这会对您有所帮助。