引用遠端資料庫物件值得注意的問題

liypsky發表於2010-12-27
在同一個資料庫內,被引用物件上進行了alter、drop等操作,該物件的依賴物件如view、function、procedure等,狀態會自動標記為Invalid,再重新使用這些依賴物件時,系統會自動重新compile。

而一個資料庫內的物件引用了遠端資料庫的物件(這裡指程式物件,如procedure等),則遠端資料庫物件發生了變更,由於本地資料庫並不知曉此種情況,本地資料庫的這些物件狀態仍然為valid,在呼叫這些物件時,Oracle會根據remote_dependencies_mode引數值,確定採用timestamp或signature進行依賴性檢查。如果發現不匹配,則會直接報錯返回,同時將依賴該遠端物件的所有本地物件標記為 invalid。

透過以下測試可以進行驗證
先在遠端資料庫上建立一個測試儲存過程

SQL> create or replace procedure p_r_test
2 is
3 begin
4 null;
5 end;
6 /

Procedure created[@more@]然後在本地資料庫上建立兩個測試儲存過程

create or replace procedure p_test1
is
begin
p_r_test@testlink
end;

/

create or replace procedure p_test2
is
begin
p_r_test@testlink
end;

/

執行一下測試程式過程

SQL> exec p_test1;

PL/SQL procedure successfully completed

檢視這兩個儲存過程的狀態

SQL> select object_name,object_type,status from all_objects where object_name in (’P_TEST1′,’P_TEST2′);

OBJECT_NAME OBJECT_TYPE STATUS
------------------------------ ------------------ -------
P_TEST1 PROCEDURE VALID
P_TEST2 PROCEDURE VALID

在遠端資料庫上重新create or replace一下程儲過程,再檢視本地資料庫兩個儲存過程的狀態

SQL> select object_name,object_type,status from all_objects where object_name in (’P_TEST1′,’P_TEST2′);

OBJECT_NAME OBJECT_TYPE STATUS
------------------------------ ------------------ -------
P_TEST1 PROCEDURE VALID
P_TEST2 PROCEDURE VALID

執行儲存過程p_test1

SQL> exec p_test1;

begin p_test1; end;

ORA-04068: 已丟棄程式包 的當前狀態
ORA-04062: timestamp (屬 procedure "TEST.P_R_TEST") 已被更改
ORA-06512: 在"TEST.P_TEST1", line 4
ORA-06512: 在line 2

再看兩個儲存過程的狀態

SQL> select object_name,object_type,status from all_objects where object_name in (’P_TEST1′,’P_TEST2′);

OBJECT_NAME OBJECT_TYPE STATUS
------------------------------ ------------------ -------
P_TEST1 PROCEDURE INVALID
P_TEST2 PROCEDURE INVALID

如果這個時候再執行p_test1,則系統發現狀態為INVALID,會進行重新編譯。

因此在涉及到呼叫遠端儲存過程的本地物件,如function、package、procedure等,需要注意遠端物件變更這種情況的發生,避免出現本地物件失效,從而引起程式問題,特別是在JOB這樣的應用中。

摘自:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/678020/viewspace-1043716/,如需轉載,請註明出處,否則將追究法律責任。

相關文章