Oracle:如何循环并查找表之间的依赖/依赖关系,以便为每个表执行插入/更新操作?

时间:2014-08-25 06:44:56

标签: oracle

我有一个要求,我必须遍历ORACLE数据库中的所有表,找到依赖项(约束,关系)并为每个表执行插入/更新操作。

有解决方案, 1)禁用所有约束并在每个表中执行插入/更新数据。缺点是:如果在启用约束时发生任何错误,oracle执行隐式提交会导致某些表被提交而无法回滚。

2)我们可以执行闪回数据库并将其恢复,但它有自己的优点和限制(因为我们只能从Oracle 10g开始执行)

所以,我发现有没有办法只做循环并找到依赖/依赖表并处理循环依赖,并对每个表执行插入/更新操作。请提供您对此查询的意见?

或 有没有办法提前评估错误而不执行实际的数据库插入/更新操作以避免隐式提交问题?

感谢您在这方面的意见。

1 个答案:

答案 0 :(得分:0)

我不确定我是否正确,但我认为你可以考虑使用所谓的Deferrable Constraints。

样本表。

create table testdefer(
  id number
, msg varchar2(42) not null initially deferred
);

此DML成功提交。

insert into testdefer values(1, 'foo');
insert into testdefer values(2, 'bar');
insert into testdefer values(3, 'baz');
commit;
select * from testdefer;

ID      MSG
-----   -----
    1   foo
    2   bar
    3   baz

而这一个

insert into testdefer values(4, 'quux');
insert into testdefer values(5, null);
insert into testdefer values(6, 'meh');
commit;

回滚所有DML,返回错误。

ORA-02091: transaction rolled back
ORA-02290: check constraint (HR.SYS_C0011594) violated

select * from testdefer;

ID      MSG
-----   -----
    1   foo
    2   bar
    3   baz

通过这种方式,您可以更新表并推迟约束和参照完整性检查,直到完成后的最后一步,并准备说COMMIT

有关可延迟约束的更多详细信息,请参阅数据库概念中的Deferrable Constraints部分。