1. 程式人生 > >細粒度依賴(一)通過資料字典找到資料庫物件之間的引用關係

細粒度依賴(一)通過資料字典找到資料庫物件之間的引用關係

開發過程中,我們經常碰到這樣的問題,一個好好的程式某一天忽然報錯了。

重新編譯,發現程式裡引用的某個物件不存在或表結構被改了,往往是在團隊合作時,由於業務需要某個成員修改了結構,但是不清楚哪些地方引用了這個物件,因此沒有處理好善後工作,最後搞得焦頭爛額。

事實上,ORACLE提供了細粒度依賴的資料字典*_dependencies,可以找出引用關係來解決這個麻煩。

先看下資料字典的結構:


從表結構可以看出,這個視圖裡包含了對遠端資料庫物件的引用關係,以下是我的一個數據庫下面遠端物件的引用關係:


下圖是我的一個生產資料庫中物件型別的引用矩陣,這是實際用到的引用關係,並不涵蓋Oracle支援的所有引用關係。

其中DEPENDENCY_TYPE分為HARD和REF兩種,對於這2種類型的解釋是REF for REF dependency HARD otherwise(引用關係是REF,其餘都是HARD)。


瞭解了這個資料字典以後,我們就會經常用到2個查詢:

1.查詢哪些物件依賴於(引用了)被我修改的表

SElECT RPAD(' ',3*(LEVEL-1))||A.OWNER||'.'||A.NAME,A.TYPE from DBA_DEPENDENCIES A
 connect by PRIOR TRIM(owner||'.'||name||'$'||type)=TRIM(referenced_owner||'.'||referenced_name||'$'||referenced_type)

  START WITH referenced_owner='CHARISMA' AND referenced_name='ST_SYSUSER' AND referenced_type='TABLE';


2.我的一個程式依賴於(引用了)哪些資料庫物件?

SELECT RPAD(' ',3*(LEVEL-1))||A.referenced_owner||'.'||A.referenced_name,A.referenced_type from DBA_DEPENDENCIES A
 connect by PRIOR TRIM(referenced_owner||'.'||referenced_name||'$'||referenced_type)=TRIM(owner||'.'||name||'$'||type)

  START WITH owner='CZFX' AND name='SP_CZ_SJTS_DATA_MAKE' AND type='PROCEDURE';


實際使用中,可以基於DBA_DEPENDENCIES檢視構建所有資料庫之間的物件應用關係拓撲,然後用DDL觸發器捕捉DDL操作,從而搭建依賴關係管理系統。將在後期的文章中進行詳細描述。