DDL失败后回滚DML

时间:2013-12-09 21:39:05

标签: sql oracle transactions oracle11g ddl

我有一种情况,我必须:

  1. 禁用某些表的FK约束
  2. 更改外键引用的主键的字段值(也会更新为匹配),
  3. 从步骤1重新启用FK约束。
  4. 问题是,如果从步骤2到主键字段的更改与外键引用的字段不一致,则重新启用步骤3中的约束可能会失败。我想捕获这种情况并回滚在步骤2中完成的更改。据我所知,运行DDL语句(如启用约束)将首先发出提交,之后我无法回滚在步骤2中所做的更改。 / p>

    有没有办法在一个独立的脚本中实现这一点?该过程应该完全通过或回滚,就像没有发生任何事情一样。或者是否可以替换可以恢复到以前状态的事务,而无需备份/恢复整个数据库?

2 个答案:

答案 0 :(得分:2)

我解决此问题的方法是在执行更新之前锁定每个表,运行查询以在重新启用约束之前手动检查任何违规。如果存在任何违规,您可以回滚更新,否则重新启用约束将执行提交并释放表锁。

答案 1 :(得分:0)

您可以尝试在自治事务中执行DDL。这样,它将与您的DML隔离。如果DDL失败,您仍然可以回滚DML。但是,如果DDL必须“看到”未提交的DML更改,那么您就会陷入困境。我认为你不能到达你想去的地方。