ORACLE包和過程依賴關係測試(轉)
一、概念
如果一個物件的定義中引用了其他物件,那麼此物件被稱為依賴物件(dependent object),此物件所引用的物件被稱為引用物件(referenced object)。為了管理方案物件(schema object)間的依賴關係,Oracle 需要記錄所有的方案的狀態(status):
有效的(valid)已經通過編譯,可以在被引用時直接使用。
INVALID狀態對於過程,函式和包來說,這意味著對其進行編譯
INVALID狀態對於檢視來說,這意味著此檢視必須使用引用物件(referenced object)當前在資料字典中的定義資訊重新進行語法分析(parse)。
狀態記錄是一個遞迴的過程。引用物件(referenced object)的狀態變化不僅會導致其直接依賴物件(directly dependent object)的狀態變化,同時會影響其間接依賴物件(indirectly dependent object)的狀態。
當一個方案物件(schema object)在 SQL 語句中被直接引用或被此語句中的依賴物件(dependent object)所引用(間接引用)時,Oracle 均會在需要時對其狀態進行檢查。SQL 語句中被直接或間接引用的物件的狀態決定了 Oracle 的後續操作:
1)如果 SQL 語句中所有的引用物件(referenced object)均處於有效狀態,則 Oracle 無需進行其他工作就可以直接執行 SQL 語句
2) 如果 SQL 語句中存在無效的引用(referenced)檢視或 PL/SQL 程式結構(過程,函式,或包),Oracle 將自動地嘗試編譯這些物件
引用物件修改後可能出現的情況如下:
如果引用表被修改,則依賴過程(dependent procedure)將處於無效狀態
如果引用檢視的基表(base table)被修改,則此檢視及依賴過程都將處於無效狀態。
如果引用獨立過程被替換(replace),則依賴過程將處於無效狀態。
如果引用包的定義(body)被替換,則依賴過程不受影響。但是當引用包的宣告(specification)被替換後,依賴過程將處於無效狀態。這是一種利用包來減少過程與引用物件之間依賴性的機制。
在分散式資料庫系統中,函式,包,觸發器等儲存過程間的依賴性是通過時間戳檢查(time stamp checking)或特徵標識檢查(signature checking)來進行管理的。
時間戳檢查
在時間戳檢查模式下,一個過程被編譯或重編譯時的時間戳(即一個過程被建立,修改或替換的時間)將被記錄在資料字典中。同時還將記錄此過程的版本資訊,包括此過程所引用的所有遠端過程的所屬方案,包名稱,過程名稱,及時間戳。
當執行一個依賴過程時,Oracle 將對此過程編譯時所記錄的遠端時間戳與遠端引用物件當前的時間戳進行比較。根據比較結果,可能有兩種情況發生:
如果時間戳比較結果一致,那麼本地及遠端過程均無需編譯就可直接執行。
如果存在時間戳比較結果不一致的遠端引用物件,那麼本地過程將被置為無效狀態,並向此過程的呼叫者傳送一個錯誤資訊。此後,Oracle 還會將所有引用了時間戳發生變化的遠端過程的本地過程置為無效狀態。例如,多個本地過程中都需呼叫一個遠端過程,且此遠端過程進行了重編譯。當一個本地過程開始執行,並發現遠端過程的時間戳有變後,所有依賴於此遠端過程的本地過程都將被置為無效狀態。
時間戳的比較發生在本地過程中呼叫遠端過程的語句執行時。此時 Oracle 才會使用分散式資料庫的通訊連結(communications link)對兩個時間戳進行比較。因此,本地過程中位於無效遠端過程呼叫之前的語句可能全部執行正常,而之後的語句則根本不會執行。此時必須對本地過程進行重編譯。
在同一個資料庫內,被引用物件上進行了alter、drop等操作,該物件的依賴物件如view、function、procedure等,狀態會自動標記為Invalid,再重新使用這些依賴物件時,系統會自動重新compile。
而一個資料庫內的物件引用了遠端資料庫的物件(這裡指程式物件,如procedure等),則遠端資料庫物件發生了變更,由於本地資料庫並不知曉此種情況,本地資料庫的這些物件狀態仍然為valid,在呼叫這些物件時,Oracle會根據remote_dependencies_mode引數值,確定採用timestamp或signature進行依賴性檢查。如果發現不匹配,則會直接報錯返回,同時將依賴該遠端物件的所有本地物件標記為invalid。
三、測試儲存過程的last_ddl_time和timestamp何時發生變化
select *
from user_objects u
where u.OBJECT_TYPE='PROCEDURE'
AND U.OBJECT_NAME='PROC_JIFEN_CX'
OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP STATUS
PROC_JIFEN_CX [NULL] 559675 [NULL] PROCEDURE 2010-5-5 17:47:58.000 2010-9-16 22:19:31.000 2010-09-16:22:19:31 VALID
/
select *
from user_objects u
where u.OBJECT_TYPE='PROCEDURE'
AND U.OBJECT_NAME='PROC_JIFEN_CX'
/
OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP STATUS
PROC_JIFEN_CX [NULL] 559675 [NULL] PROCEDURE 2010-5-5 17:47:58.000 2010-11-5 11:38:09.000 2010-09-16:22:19:31 VALID
/
--儲存過程狀態為valid,編譯儲存過程,不改變內容,last_ddl_time改變,timestamp不變;
alter table JIFEN_CX_LOG add nyytest number(2)
/
select *
from user_objects u
where u.OBJECT_TYPE='PROCEDURE'
AND U.OBJECT_NAME='PROC_JIFEN_CX'
/
OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP STATUS
PROC_JIFEN_CX [NULL] 559675 [NULL] PROCEDURE 2010-5-5 17:47:58.000 2010-11-5 11:38:09.000 2010-09-16:22:19:31 INVALID
select *
from user_objects u
where u.OBJECT_TYPE='PROCEDURE'
AND U.OBJECT_NAME='PROC_JIFEN_CX'
/
--儲存過程狀態為invalid,編譯儲存過程,狀態變為valid,last_ddl_time和timestamp都改為最新的
---遠端資料庫呼叫執行報錯ORA-04062: timestamp of procedure "EDU.PROC_JIFEN_CX" has been changed; 過程狀態已為valid,再次執行成功,last_ddl_time和timestamp都改為最新的
OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP STATUS
PROC_JIFEN_CX [NULL] 559675 [NULL] PROCEDURE 2010-5-5 17:47:58.000 2010-11-5 11:42:40.000 2010-11-05:11:42:40 VALID
三、測試package body的last_ddl_time和timestamp何時發生變化
select *
from user_objects u
where U.OBJECT_NAME='PKG_JIFEN_CX_SET'
AND OBJECT_TYPE='PACKAGE BODY'
OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP
PKG_JIFEN_CX_SET [NULL] 192968 [NULL] PACKAGE BODY 2010-11-5 11:48:45.000 2010-11-5 11:48:45.000 2010-11-05:11:48:45
---編譯之前狀態為valid,編譯之後,last_ddl_time變化,timestamp不變
select *
from user_objects u
where U.OBJECT_NAME='PKG_JIFEN_CX_SET'
AND OBJECT_TYPE='PACKAGE BODY'
/
select *
from user_objects u
where U.OBJECT_NAME='PKG_JIFEN_CX_SET'
/
OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP STATUS
PKG_JIFEN_CX_SET [NULL] 192968 [NULL] PACKAGE BODY 2010-11-5 11:48:45.000 2010-11-5 11:51:23.000 2010-11-05:11:48:45 VALID
/
alter table JIFEN_CX_LOG add nyytest number(2)
--修改依賴表的表結構,package body狀態為invalid,package狀態為valid,遠端資料庫呼叫包執行正常,且執行過後package body已編譯通過狀態為valid,last_ddl_time和timestamp都已修改為當前時間
OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP STATUS
PKG_JIFEN_CX_SET [NULL] 192968 [NULL] PACKAGE BODY 2010-11-5 11:48:45.000 2010-11-5 11:51:23.000 2010-11-05:11:48:45 INVALID
/
--遠端資料庫呼叫包執行正常,且執行過後package body狀態為valid,last_ddl_time和timestamp都已修改為當前時間
OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP STATUS
PKG_JIFEN_CX_SET [NULL] 192968 [NULL] PACKAGE BODY 2010-11-5 11:48:45.000 2010-11-5 11:54:55.000 2010-11-05:11:54:55 VALID
參考:1、ASK TOM:
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:286816015990
2、ORACLE CONCEPTS 6: Dependencies Among Schema Objects
測試環境:oracle 10.2.0.4
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20985606/viewspace-745168/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【python】【安裝包依賴關係】Python
- 解決rpm包依賴關係
- Maven 依賴關係Maven
- build task依賴關係UI
- 分析資料庫的依賴關係(轉)資料庫
- 使用yum 安裝依賴關係較多的包
- Angular 依賴的測試和 FakeAngular
- Oracle 查詢鎖之間的依賴關係Oracle
- 關聯關係與依賴關係的區別
- 透過shell分析表依賴的層級關係
- 通過shell分析表依賴的層級關係
- CentOS 6.4安裝Oracle 10g2 rac 包的依賴關係備記CentOSOracle 10g
- Spring框架模組依賴關係Spring框架
- mysql主外來鍵依賴關係MySql
- depmod解決模組依賴關係
- 查詢依賴關係的objects 是否有被DDL過Object
- OSGI中的service依賴關係管理
- 【物件導向依賴關係概念總結】物件導向程式設計的五種依賴關係物件程式設計
- 專案管理中,如何識別和管理依賴關係?專案管理
- nuget使用經驗:複雜依賴關係下的包版本問題
- [測試經驗] 依賴方介面呼叫測試
- HTop依賴包
- Elasticsearch依賴與Spring對應關係ElasticsearchSpring
- Android專案的依賴關係解析Android
- 使用 .NET Core 實現依賴關係注入
- 黑盒測試和白盒測試的關係
- 關於 OkHttp 依賴衝突問題的解決過程HTTP
- 如何正確地實現Java模組與inter-module Maven構建測試依賴關係JavaMaven
- gcc 標頭檔案依賴關係 分析工具GC
- Oracle 查詢鎖之間依賴關係的最源頭SIDOracle
- 物件導向程式設計程式碼詳解(依賴關係,關聯關係,組合關係)物件程式設計
- spring cloud alibaba 元件版本關係 以及 畢業版本依賴關係SpringCloud元件
- 依賴注入和控制反轉依賴注入
- 【學習】= 概念 + 關係 + 關係發生的過程和條件
- 依賴管理和依賴範圍
- maven中scope依賴範圍與classpath的關係Maven
- .NET Core新增專案之間的依賴關係
- ORACLE儲存過程中建立子過程的測試!Oracle儲存過程