2017-04-13 46 views
2

假設有2種模式AB是否安全並可以使用循環依賴關係恢復Oracle轉儲?

  1. BA
  2. A定義若干視圖中定義了一些觸發器,其使用的功能從B架構。

是否可以爲AB創建轉儲並稍後恢復?例如,如果我創建轉儲A並嘗試將其還原到Oracle實例,而沒有B我收到編譯錯誤。那麼AB轉儲是否可以在沒有編譯錯誤的情況下恢復? (可能會恢復A,然後B並再次從A恢復錯誤部分)。有沒有辦法處理這種情況?

+0

您的意思是「意見」或「物化視圖」?有一個區別。 – APC

+0

我的意思是,如果你用'物化視圖'功能提供擴展答案,它將會很好。 – Cherry

回答

2

循環依賴通常被認爲是一件壞事。最佳實踐最近的事情是沒有他們。有第三個模式C其中有一個或兩個模式共享的東西。所以,一些變化:

  • C - >BC - >A,或
  • C - >B - >A,或
  • B - >C - >A

這提供了一個清晰的恢復路徑:當我們恢復A(無)或時,我們可以計算出什麼會中斷(也許是一切)。

但是,鑑於你是你所在的地方,需要記住的是代碼可以重新編譯。我們可以創建缺少依賴關係的包,函數和觸發器;它們將是無效的,但是一旦依賴關係到位,就可以重新編譯它們。

視圖略有不同;除非我們使用FORCE關鍵字,否則它們將失敗,除非我們使用FORCE關鍵字:create or replace force v_whatever as ...。使用FORCE後,視圖將在無效狀態下創建,以便稍後重新編譯。

另一個複雜性是對無效對象的授權將失敗。您有循環撥款,這將使恢復變得困難,因爲您需要先獲得B有效的對象,然後纔可以授予A,反之亦然。

最後一件事:依靠dump(export)來備份代碼可能是個壞主意。使用PL/SQL程序,視圖等的源代碼控制。它比導入模式提供更多的部署控制。