这两天老大让我再oracle中把要替换的表被其他对象引用之处找出来,整理一份表,接到这个任务,我是一脸懵逼,怎么找?大海捞针么?问同事、查资料,自己研究,最后整理一下仅供大家参考,同时以备将来回顾。本篇只涉及表被其他数据库对象引用,不涉及外键,想寻找外键的,自己查看下面附有的链接。
首先有下列几种方式:
1、plsql工具
;
点击工具,找到 查找数据库对象
最后进入到查找页面
最后根据页面把要查找的 表对象或者关键词填入 文本查找 里,再在对象条件里 选择自己要筛选的条件即可筛选。但是此方法有个弊端,就是 所有者 中下拉条件太多,要筛选很多次。
2.通过sql去查询。相关sql我是网上查阅资料,无意中看到有位大哥曾经在自己的博客回答过这个问题,先推荐给大家http://53873039oycg.iteye.com/blog/2030263/。这位大哥,小弟很不好意思在此引用一下您的内容,敬请见谅。
a>正常情况(无动态SQL时)
System/Sysdba用户,可以使用以下SQL查看:
|
普通用户可以使用以下SQL查看:
|
b>动态SQL情况
System/Sysdba可以使用下面的SQL查询:
|
普通用户可以使用下面的SQL查询:
|
查看所有引用表的动态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 |