2016-11-23 58 views
-1

由於某種原因,我的團隊每年會多次編寫一個新的Oracle軟件包,而且大多數情況下,這個軟件包只引用包(我們的軟件包運行的用戶/角色)已經授予的表。有沒有辦法從Oracle包中以編程方式提取表引用?

偶爾,情況並非如此。該軟件包已簽入,未能編譯,並且在表名稱附近出現一條含有行號的隱含錯誤消息。

麻煩的是,在這一點上,我們將等待幾個小時(政治)審批流程發放,授予給予,我們在...中檢查軟件包,並且失敗並顯示新的表名。

有沒有辦法以編程方式獲得所有引用的列表?如果是這樣,我們可以將它自動化以檢查dba_tab_privs以查看是否需要事先提供授權,或者甚至生成授予腳本以使團隊中的事情更容易實際發放這些授予(特別是幾個月後,當它被部署到生產中時我們又一次經歷了整個遺憾)。

回答

5

假設所有的引用是靜態的(即你沒有在你的代碼的隨機動態SQL位),你可以查詢`dba_dependencies'

select referenced_owner, referenced_name 
    from dba_dependencies 
where owner = <<owner of package>> 
    and name = <<name of package>> 
    and type = 'PACKAGE BODY' 
    and referenced_type = 'TABLE' 

你可以尋找非表引用如果你願意的話,還可以使用與包規範相關的依賴關係和包體。這將只顯示包體依賴於表的情況。

+0

當他們不給我對dba_dependencies的權限! –

+0

@Gary_W - 根據您可以做出的假設,您可以使用'all_dependencies'或'user_dependences'。如果你正在考慮使用'dba_tab_privs'來自動完成需要的授權,我認爲你可以要求'dba_dependencies'的特權。 –

+0

甜! ALL_DEPENDENCIES起作用。這對我來說是新的。謝謝! –

1

查看ALL_SOURCE表。您可以針對TEXT列查詢您正在查找的內容。

select * 
from all_source 
where type = 'PACKAGE BODY' 
and owner = 'XYZ' 
and name = 'YOUR PACKAGE NAME' 
order by line; 

編輯:賈斯廷洞穴的答案是正確的,但我會留下這裏的信息無論如何,因爲信息的每一點點幫助。

相關問題