zoukankan      html  css  js  c++  java
  • 如何在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

  • 相关阅读:
    程序员的健康问题
    比特币解密
    浅谈比特币
    一款能帮助程序员发现问题的软件
    微软为什么总招人黑?
    写了一个bug,最后却变成了feature,要不要修呢?
    不管你信不信,反正我信了
    Excel工作表密码保护的破解
    pip笔记(译)
    super
  • 原文地址:https://www.cnblogs.com/jjj250/p/10178564.html
Copyright © 2011-2022 走看看