引用遠端資料庫物件值得注意的問題
在同一個資料庫內,被引用物件上進行了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這樣的應用中。
摘自:
而一個資料庫內的物件引用了遠端資料庫的物件(這裡指程式物件,如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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 遠端資料庫的訪問 (轉)資料庫
- Mysql資料庫的遠端訪問設定MySql資料庫
- 本機資料庫資料庫鏈無法訪問遠端資料庫資料庫
- 資料庫物件命名規範問題....資料庫物件
- Oracle資料鏈+同義詞+訪問遠端資料庫Oracle資料庫
- 遠端資料庫恢復資料庫
- Oracle如何診斷遠端訪問資料庫慢/超時等問題小結Oracle資料庫
- 請教高手門:如何遠端訪問Access資料庫?資料庫
- 遠端連線mysql資料庫MySql資料庫
- DUPLICATE遠端複製資料庫資料庫
- IMPDP匯入遠端資料庫資料庫
- 寶塔部署 寶塔遠端連線資料庫出現1045問題資料庫
- 遠端啟動資料庫的條件資料庫
- Java連線遠端的Access資料庫Java資料庫
- Oracle資料庫無效物件問題處理Oracle資料庫物件
- phpstudy設定允許遠端訪問mysql資料庫PHPMySql資料庫
- DB2訪問遠端資料庫通訊錯誤DB2資料庫
- oracle資料庫遠端不落地匯入本地資料庫Oracle資料庫
- ORACLE 配置連線遠端資料庫Oracle資料庫
- 資料庫遠端檔案匯入資料庫
- 多個遠端資料庫查詢資料庫
- 資料庫遠端連線失敗資料庫
- 遠端連線問題
- std::io::BufReader 物件借用和引用的問題物件
- 一個物件多處引用的維護問題物件
- 使用遠端控制操作遠端xp sp2的問題
- 模組化日常:CocoaPods 庫資源引用問題
- 在CentOS6.0上配置Oracle資料庫可以遠端使用的遠端配置。CentOSOracle資料庫
- [20150911]關於遠端啟動資料庫問題.txt資料庫
- 解決ssms2012連線遠端資料庫報錯崩潰的問題SSM資料庫
- plsql本機不安裝資料庫連線遠端資料庫SQL資料庫
- 不用安裝oracle客戶端,PL/SQL也能遠端訪問資料庫Oracle客戶端SQL資料庫
- 客戶端無法連線資料庫的小問題客戶端資料庫
- 插入遠端資料庫資料遇到分割槽表bug資料庫
- 連線資料之遠端呼叫Access資料庫(轉)資料庫
- 遠端備份資料庫和檔案的方法資料庫
- php遠端連線mysql資料庫的步驟PHPMySql資料庫
- Java中容器Vectort用add新增物件是物件引用的問題Java物件