假设有2个架构A
和B
:
B
定义了A
个表格A
定义了一些使用B
架构函数的触发器。为A
或B
创建转储并稍后恢复是否安全?例如,如果我创建转储A
并尝试将其还原到没有B
的Oracle实例,则会出现编译错误。那么可以在没有编译错误的情况下恢复A
或B
转储吗? (可以恢复A
然后B
并再次从A
恢复错误部分。有没有办法或做法来处理这种情况?
答案 0 :(得分:2)
循环依赖通常被认为是一件坏事。最接近最佳实践的是没有它们。拥有第三个模式C
,其中包含一个或两个模式共享的内容。所以,有些变化:
C
- > B
和C
- > A
或C
- > B
- > A
或B
- > C
- > A
这提供了一个明确的恢复路径:当我们恢复A
(无)或C
(可能是一切)时,我们可以弄清楚会破坏什么。
但是考虑到你就在你身边,要记住的是代码可以重新编译。我们可以创建缺少依赖关系的包,函数和触发器;它们将无效,但可以在依赖项到位后重新编译。
观点略有不同;除非我们使用FORCE关键字create or replace force v_whatever as ...
,否则如果缺少依赖项,它们将失败。使用FORCE,视图将在无效状态下创建,以便稍后重新编译。
另一个复杂性是无效对象的授权将失败。您有循环授权,这将使恢复变得困难,因为您需要使B
中的对象有效,然后才能授予A
,反之亦然。
最后一件事:依靠dump(导出)来备份代码可能是一个坏主意。对PL / SQL程序,视图等使用源代码控制。与导入架构相比,它提供了更多的部署控制。