我想知道重新编译由于其中一个更改而变得无效的 Oracle 10g 可编程对象的最佳实践是什么。
更具体地说,我有一些使用模式级别类型的包。我在系统中也有从包中调用函数/过程的触发器。据我了解,包主体的更改不需要任何进一步的操作(重新编译主体除外)。但是,如果我更改 package ,我必须重新编译使用这个包的触发器以及其他依赖于它的包。
到目前为止,我只是抓取了无效对象的列表并重新编译它们或使用了 DBMS_UTILITY.compile_schema。
谢谢你。
我想知道重新编译由于其中一个更改而变得无效的 Oracle 10g 可编程对象的最佳实践是什么。
更具体地说,我有一些使用模式级别类型的包。我在系统中也有从包中调用函数/过程的触发器。据我了解,包主体的更改不需要任何进一步的操作(重新编译主体除外)。但是,如果我更改 package ,我必须重新编译使用这个包的触发器以及其他依赖于它的包。
到目前为止,我只是抓取了无效对象的列表并重新编译它们或使用了 DBMS_UTILITY.compile_schema。
谢谢你。
诀窍是一次性重新编译包和相关代码。如果您正在用新数据刷新开发数据库,您将拥有大量无效过程。同样,对于依赖代码,您会发现自己一遍又一遍地重新编译。您可以使用位于 $ORACLE_HOME/rdbms/admin/utlrcmp.sql 中的此命令:
(可从 9i 获得,但针对 10g 和 11 进行了改进)
如果您有无效且无效的包,无论出于何种原因,您都可以使用Martin Mares的这个包,它将递归编译除您指定的对象之外的所有无效对象。
就最佳实践而言,我尝试限制依赖链。在鼓励依赖和拥有独立包的“不要重复自己”之间总是有一个折腾。
我的经验法则是,如果包/触发器/对象与另一个数据库交互,请尝试减少依赖关系,因此如果出现问题,您可以减少查找问题根源的地方。