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

Posted

技术标签:

【中文标题】Oracle:如何循环并查找表之间的依赖/依赖关系,以便为每个表执行插入/更新操作?【英文标题】:Oracle: How to loop and find dependent/dependency between tables for doing insert/update operation for each tables? 【发布时间】:2014-08-25 06:44:55 【问题描述】:

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

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

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

所以,我发现有什么方法可以进行循环并找到依赖/依赖表并处理循环依赖关系,并对每个表执行插入/更新操作。请提供您对此查询的意见?

或 有什么方法可以在不执行实际数据库插入/更新操作的情况下提前评估错误以避免隐式提交问题?

感谢您在这方面的意见。

【问题讨论】:

【参考方案1】:

我不确定我是否理解正确,但我认为您可以考虑使用所谓的可延迟约束。

示例表。

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 部分。

【讨论】:

我同意,但我们的 dbas 告诉我们,可延迟约束并不是一种理想的方式。有没有办法循环获取表依赖并执行插入/更新操作?

以上是关于Oracle:如何循环并查找表之间的依赖/依赖关系,以便为每个表执行插入/更新操作?的主要内容,如果未能解决你的问题,请参考以下文章

如何查找存储过程中引用的表及其关联列

商店之间的循环模块依赖关系

查找 Common Lisp 文件之间的依赖关系

如何设置依赖于其他两个表关系的外键?

深谈Spring如何解决Bean的循环依赖

如何:查看数据库对象的依赖关系