1. 程式人生 > >如何在Oracle中 查詢一個表被其他數據庫對象引用[z]

如何在Oracle中 查詢一個表被其他數據庫對象引用[z]

選擇 條件 資料 一個 union all 同時 rom 整理 自己

這兩天老大讓我再oracle中把要替換的表被其他對象引用之處找出來,整理一份表,接到這個任務,我是一臉懵逼,怎麽找?大海撈針麽?問同事、查資料,自己研究,最後整理一下僅供大家參考,同時以備將來回顧。本篇只涉及表被其他數據庫對象引用,不涉及外鍵,想尋找外鍵的,自己查看下面附有的鏈接。

首先有下列幾種方式:

1、plsql工具

點擊工具,找到 查找數據庫對象

最後進入到查找頁面

最後根據頁面把要查找的 表對象或者關鍵詞填入 文本查找 裏,再在對象條件裏 選擇自己要篩選的條件即可篩選。但是此方法有個弊端,就是 所有者 中下拉條件太多,要篩選很多次。

2.通過sql去查詢。相關sql我是網上查閱資料,無意中看到有位大哥曾經在自己的博客回答過這個問題,先推薦給大家http://53873039oycg.iteye.com/blog/2030263/。這位大哥,小弟很不好意思在此引用一下您的內容,敬請見諒。

a>正常情況(無動態SQL時)

System/Sysdba用戶,可以使用以下SQL查看:

select * from dba_dependencies where referenced_name =upper(‘對象名‘) and owner=upper(‘所有者‘)
普通用戶可以使用以下SQL查看:

select * from all_dependencies where referenced_name =upper(‘對象名‘)
b>動態SQL情況

System/Sysdba可以使用下面的SQL查詢:

select name,type,text from dba_source where upper(text) like ‘%對象名%‘ and owner=upper(‘所有者‘)
普通用戶可以使用下面的SQL查詢:

select name,type,text from user_source where upper(text) like ‘%對象名%‘
查看所有引用表的動態sql:

System/Sysdba用戶:

select name, type, text

from dba_source

where name in (select name

from dba_source

where upper(text) like ‘%對象名%‘

and owner = upper(‘所有者‘)

minus

select name

from dba_dependencies

where referenced_name = upper(‘對象名‘)

and owner = upper(‘所有者‘))

and owner = upper(‘所有者‘)

普通用戶:

select name, type, text

from user_source

where name in

(select name

from user_source

where upper(text) like ‘%對象名%‘

minus

select name from all_dependencies where referenced_name = upper(‘對象名‘))


好啦,以上就是借鑒那位大哥的,下面奉上小弟修改的

查看所有引用表的動態sql(考慮到實際項目中有的公司可能存儲過程或者函數、視圖裏有的使用對象名是大寫有的是小寫的參考):

普通用戶:

select distinct name, type
from user_source
where name in (select a.name
from user_source a
where a.text like ‘%對象名小寫%‘ or a.TEXT like ‘%對象名大寫%‘
group by a.name
minus
select name
from all_dependencies
where referenced_name = ‘對象名小寫‘ or referenced_name = ‘對象名大寫‘ )

所以小編就對比動態和靜態情況下sql,發現動態情況下sql中包含了靜態情況下的sql,而且用了minus函數,

minus函數是什麽呢?有什麽作用呢?

給大家普及一下minus函數用法:

racle Minus關鍵字
  SQL中有一個MINUS關鍵字,它運用在兩個SQL語句上,它先找出第一條SQL語句所產生的結果,然後看這些結果有沒有在第二個SQL語句的結果中。如果有的話,那這一筆記錄就被去除,而不會在最後的結果中出現。如果第二個SQL語句所產生的結果並沒有存在於第一個SQL語句所產生的結果內,那這筆資料就被拋棄。
好了,既然知道了minus函數的作用,那我們何不自己寫個查詢所有的情況(既有靜態又有動態的情況)的sql呢,福利來了,那麽久整理出了下面的sql,查詢的結果包含了對象本身哦。此處小編采用的 UNION ALL 取並集。然後把重復的過濾掉

select distinct name,type
from (select a.name,a.TYPE
from user_source a
where a.text like ‘%表名小寫%‘ or a.TEXT like ‘%表名大寫%‘
group by a.name,a.TYPE
UNION ALL
select name,type
from all_dependencies
where referenced_name = ‘表名大寫‘ or referenced_name = ‘表名小寫‘) v
---------------------
作者:m0_37984249
來源:CSDN
原文:https://blog.csdn.net/m0_37984249/article/details/81097867

如何在Oracle中 查詢一個表被其他數據庫對象引用[z]