如何在Oracle中 查询一个表被其他数据库对象引用[z]

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

原文地址:https://www.cnblogs.com/jjj250/p/10178564.html

时间: 2024-08-24 17:06:14

如何在Oracle中 查询一个表被其他数据库对象引用[z]的相关文章

Oracle中查询一个表中字段(列)个数

如果一个表中有很多的字段,而我们想要知道这个表中的字段个数,如果使用如下方式一个一个数,则显得很麻烦 Oracle中可以使用如下sql来查询字段(列)个数 select count(*) from user_tab_columns where table_name=upper('表名') 或者 select max(column_id) from user_tab_columns where table_name=upper('表名') 作者:itmyhome 链接:http://blog.cs

oracle中查询用户表/索引/视图创建语句

不多说,直接上干货 1.查询当前用户下表的创建语句 select dbms_metadata.get_ddl('TABLE','ux_future') from dual; 2.查询其他用户下表的创建语句 select dbms_metadata.get_ddl('TABLE','ux_future','Admin') from dual; 3.查询当前用户下索引的创建语句 select dbms_metadata.get_ddl('INDEX','ux_future') from dual;

Oracle中查看一个表是否被锁住

SELECT OBJECT_NAME,       SESSION_ID SID,       MACHINE,       VS.MODULE,       'ALTER   SYSTEM   KILL   SESSION   ''' || SESSION_ID || ', ' ||       SERIAL# || '''; ' KILL_SESSION,       VS.STATUS,       VS.ACTION,       SERIAL#,       ORACLE_USERNA

Oracle中查询一个字符串的长度的函数

Oracle取字符串长度的函数length()和lengthb() lengthb(string)计算string所占的字节长度:返回字符串的长度,单位是字节 length(string)计算string所占的字符长度:返回字符串的长度,单位是字符 对于单字节字符,lengthb()和length()是一样的 可以用lengthb('string')=length('string') 判断字符串是否含有中文

oracle中删除一个表的记录的同时,保存到另一个表的触发器

create or replace trigger delete_SXCLGC_tri  after delete on winf_sv_ex_hybs_sxclgc  for each row       DECLARE           begin         insert into WINF_SV_EDITORIAL_DELETE(          SXBM,XH,HJBH,HJFZRXM,         HJFZRSJ,HJFZRZWDM,HJFZRZWMC,HJMC,    

oracle中查询所有外键引用到某张表的记录

其实查找这篇文章  我主要用的sql 是这句  select * from user_cons_columns t where t.constraint_name like 'FK_CTS_CONT_REINS__CRR'; 起因: 系统测试的时候发现如果某条记录已经被引用了,这个时候删除这条记录会引起数据不一致,系统会报错.比如警员信息,在考勤记录表里会引用警员ID,如果考勤记录表中已经存在这个警员ID了,这时从警员表中删除该警员,就会引起数据不一致,前台报错.所以,这个时候我就想查找数据库中

【翻译自mos文章】在一个使用uniform size的 本地管理的表空间中建立一个表,为什么会忽略INITIAL 参数?

翻译:Why Does a Table Created in a Locally Managed Tablespace With Uniform Extents Ignore INITIAL? (文档 ID 753662.1) 在一个使用uniform size的 本地管理的表空间中建立一个表,为什么会忽略INITIAL 参数? 适用于: Oracle Database - Enterprise Edition - Version 8.1.5.0 to 11.1.0.7 [Release 8.1

如何在oracle中导入dmp数据库文件

Oracle数据导入导出imp/exp就相当于oracle数据还原与备份.exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中. 利用这个功能可以构建两个相同的数据库,一个用来测试,一个用来正式使用. 执行环境:可以在SQLPLUS.EXE或者DOS(命令行)中执行, DOS中可以执行时由于 在oracle 8i 中 安装目录\ora81\BIN被设置为全局路径, 该目录下有EXP.EXE与IMP.EXE文件被用来执行导入导出.

oracle中的dual表详解

oracle中的dual表详解 1.DUAL表的用途 Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中 --查看当前连接用户 SQL> select user from dual; USER ------------------------------ SYSTEM --查看当前日期.时间 SQL> select sysdate from dual; SYSDATE ----------- 2007-1-24 1 SQL> sele