这两天老大让我再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