Oracle-10g

在 Oracle 中重新編譯依賴對象

  • November 15, 2012

我想知道重新編譯由於其中一個更改而變得無效的 Oracle 10g 可程式對象的最佳實踐是什麼。

更具體地說,我有一些使用模式級別類型的包。我在系統中也有從包中呼叫函式/過程的觸發器。據我了解,包主體的更改不需要任何進一步的操作(重新編譯主體除外)。但是,如果我更改 package ,我必須重新編譯使用這個包的觸發器以及其他依賴於它的包。

到目前為止,我只是抓取了無效對象的列表並重新編譯它們或使用了 DBMS_UTILITY.compile_schema。

謝謝你。

訣竅是一次性重新編譯包和相關程式碼。如果您正在用新數據刷新開發數據庫,您將擁有大量無效過程。同樣,對於依賴程式碼,您會發現自己一遍又一遍地重新編譯。您可以使用位於 $ORACLE_HOME/rdbms/admin/utlrcmp.sql 中的此命令:

BEGIN
UTL_RECOMP.RECOMP_SERIAL(schema => ‘MY_SCHEMA_NAME’);
END;

(可從 9i 獲得,但針對 10g 和 11 進行了改進)

如果您有無效且無效的包,無論出於何種原因,您都可以使用Martin Mares的這個包,它將遞歸編譯除您指定的對象之外的所有無效對象。

就最佳實踐而言,我嘗試限制依賴鏈。在鼓勵依賴和擁有獨立包的“不要重複自己”之間總是有一個折騰。

我的經驗法則是,如果包/觸發器/對象與另一個數據庫互動,請嘗試減少依賴關係,因此如果出現問題,您可以減少查找問題根源的地方。

引用自:https://dba.stackexchange.com/questions/28747