Oracle中检查外键是否有索引的SQL脚本分享

 更新时间:2014年10月30日 09:53:32   投稿:junjie  
这篇文章主要介绍了Oracle中检查外键是否有索引的SQL脚本分享,本文给出了两个版本的脚本源码,一个查询所有用户,一个查询单用户,需要的朋友可以参考下

复制代码 代码如下:

COLUMN COLUMNS format a30 word_wrapped
COLUMN tablename format a15 word_wrapped
COLUMN constraint_name format a15 word_wrapped
SELECT TABLE_NAME,
       CONSTRAINT_NAME,
       CNAME1 || NVL2(CNAME2, ',' || CNAME2, NULL) ||
       NVL2(CNAME3, ',' || CNAME3, NULL) ||
       NVL2(CNAME4, ',' || CNAME4, NULL) ||
       NVL2(CNAME5, ',' || CNAME5, NULL) ||
       NVL2(CNAME6, ',' || CNAME6, NULL) ||
       NVL2(CNAME7, ',' || CNAME7, NULL) ||
       NVL2(CNAME8, ',' || CNAME8, NULL) COLUMNS
  FROM (SELECT B.TABLE_NAME,
               B.CONSTRAINT_NAME,
               MAX(DECODE(POSITION, 1, COLUMN_NAME, NULL)) CNAME1,
               MAX(DECODE(POSITION, 2, COLUMN_NAME, NULL)) CNAME2,
               MAX(DECODE(POSITION, 3, COLUMN_NAME, NULL)) CNAME3,
               MAX(DECODE(POSITION, 4, COLUMN_NAME, NULL)) CNAME4,
               MAX(DECODE(POSITION, 5, COLUMN_NAME, NULL)) CNAME5,
               MAX(DECODE(POSITION, 6, COLUMN_NAME, NULL)) CNAME6,
               MAX(DECODE(POSITION, 7, COLUMN_NAME, NULL)) CNAME7,
               MAX(DECODE(POSITION, 8, COLUMN_NAME, NULL)) CNAME8,
               COUNT(*) COL_CNT
          FROM (SELECT SUBSTR(TABLE_NAME, 1, 30) TABLE_NAME,
                       SUBSTR(CONSTRAINT_NAME, 1, 30) CONSTRAINT_NAME,
                       SUBSTR(COLUMN_NAME, 1, 30) COLUMN_NAME,
                       POSITION
                  FROM USER_CONS_COLUMNS) A,
               USER_CONSTRAINTS B
         WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
           AND B.CONSTRAINT_TYPE = 'R'
         GROUP BY B.TABLE_NAME, B.CONSTRAINT_NAME) CONS
 WHERE COL_CNT > ALL
 (SELECT COUNT(*)
          FROM USER_IND_COLUMNS I
         WHERE I.TABLE_NAME = CONS.TABLE_NAME
           AND I.COLUMN_NAME IN (CNAME1, CNAME2, CNAME3, CNAME4, CNAME5,
                CNAME6, CNAME7, CNAME8)
           AND I.COLUMN_POSITION <= CONS.COL_CNT
         GROUP BY I.INDEX_NAME)
/

在上面的基础上修改了一下,可以检查所有的用户。
复制代码 代码如下:

SET linesize 400;
COLUMN OWNER format a10 word_wrapped
COLUMN COLUMNS format a30 word_wrapped
COLUMN TABLE_NAME format a15 word_wrapped
COLUMN CONSTRAINT_NAME format a40 word_wrapped
SELECT OWNER,
     TABLE_NAME,
       CONSTRAINT_NAME,
       CNAME1 || NVL2(CNAME2, ',' || CNAME2, NULL) ||
       NVL2(CNAME3, ',' || CNAME3, NULL) ||
       NVL2(CNAME4, ',' || CNAME4, NULL) ||
       NVL2(CNAME5, ',' || CNAME5, NULL) ||
       NVL2(CNAME6, ',' || CNAME6, NULL) ||
       NVL2(CNAME7, ',' || CNAME7, NULL) ||
       NVL2(CNAME8, ',' || CNAME8, NULL) COLUMNS
  FROM (SELECT B.OWNER,B.TABLE_NAME,
               B.CONSTRAINT_NAME,
               MAX(DECODE(POSITION, 1, COLUMN_NAME, NULL)) CNAME1,
               MAX(DECODE(POSITION, 2, COLUMN_NAME, NULL)) CNAME2,
               MAX(DECODE(POSITION, 3, COLUMN_NAME, NULL)) CNAME3,
               MAX(DECODE(POSITION, 4, COLUMN_NAME, NULL)) CNAME4,
               MAX(DECODE(POSITION, 5, COLUMN_NAME, NULL)) CNAME5,
               MAX(DECODE(POSITION, 6, COLUMN_NAME, NULL)) CNAME6,
               MAX(DECODE(POSITION, 7, COLUMN_NAME, NULL)) CNAME7,
               MAX(DECODE(POSITION, 8, COLUMN_NAME, NULL)) CNAME8,
               COUNT(*) COL_CNT
          FROM (SELECT SUBSTR(TABLE_NAME, 1, 30) TABLE_NAME,
                       SUBSTR(CONSTRAINT_NAME, 1, 30) CONSTRAINT_NAME,
                       SUBSTR(COLUMN_NAME, 1, 30) COLUMN_NAME,
                       POSITION
                  FROM DBA_CONS_COLUMNS WHERE OWNER NOT IN ('SYS','SYSTEM','SYSMAN','HR','OE','EXFSYS','DBSNMP','MDSYS','OLAPSYS','SCOTT','EXFSYS','SH','PM','CTXSYS')) A,
               DBA_CONSTRAINTS B
         WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
           AND B.CONSTRAINT_TYPE = 'R'
         GROUP BY B.OWNER,B.TABLE_NAME, B.CONSTRAINT_NAME) CONS
 WHERE COL_CNT > ALL
 (SELECT COUNT(*)
          FROM DBA_IND_COLUMNS I
         WHERE I.TABLE_NAME = CONS.TABLE_NAME AND I.TABLE_OWNER=CONS.OWNER
           AND I.COLUMN_NAME IN (CNAME1, CNAME2, CNAME3, CNAME4, CNAME5,
                CNAME6, CNAME7, CNAME8)
           AND I.COLUMN_POSITION <= CONS.COL_CNT
         GROUP BY I.INDEX_NAME)
/

相关文章

  • Oracle数据库中TRUNC()函数示例详解

    Oracle数据库中TRUNC()函数示例详解

    在Oracle数据库中TRUNC函数主要用于截断日期、时间或数值,通过指定不同的格式参数,可以截取日期或时间的特定部分,如年份、月份、小时等,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • 解决oracle用户连接失败的解决方法

    解决oracle用户连接失败的解决方法

    oracle用户连接失败的问题着实让我们头疼,下面就为您介绍oracle用户连接失败的解决方法,希望对您学习oracle用户连接方面能有所帮助。
    2010-12-12
  • Oracle数据库安装教程并实现公网远程连接(内网穿透)

    Oracle数据库安装教程并实现公网远程连接(内网穿透)

    Oracle数据库是用于处理数据存储及大量数据计算的常用数据库,下面这篇文章主要给大家介绍了关于Oracle数据库安装教程并实现公网远程连接(内网穿透)的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • Oracle中的INSTR,NVL和SUBSTR函数的用法详解

    Oracle中的INSTR,NVL和SUBSTR函数的用法详解

    这篇文章主要介绍了Oracle中的INSTR,NVL和SUBSTR函数的用法详解,需要的朋友可以参考下
    2017-02-02
  • oracle求字符串长度函数length()和hengthb()简介

    oracle求字符串长度函数length()和hengthb()简介

    这篇文章主要介绍了Oracle求字符串长度函数length()和hengthb()简介,具有一定参考价值,需要的朋友可以了解下。
    2017-09-09
  • Oracle数据库的备份与恢复案例详解

    Oracle数据库的备份与恢复案例详解

    这篇文章介绍了Oracle数据库的备份与恢复的方法,文中通过示例代码介绍的非常详细。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-11-11
  • Oracle PL/SQL中异常高级特性示例解析

    Oracle PL/SQL中异常高级特性示例解析

    本文只介绍3种PL/SQL异常的三种高级形态,用于解决Oracle内置异常过少,很多时候不能够满足实际的使用需求。对oracle 高级特性相关知识感兴趣的朋友一起看看吧
    2018-08-08
  • oracle初始化参数设置

    oracle初始化参数设置

    oracle初始化参数设置...
    2007-03-03
  • 解决pl/sql developer中数据库插入数据乱码问题(SSM项目开发)

    解决pl/sql developer中数据库插入数据乱码问题(SSM项目开发)

    这篇文章主要介绍了解决pl/sql developer中数据库插入数据乱码问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Oracle跨库访问DBLINK使用以及实际应用

    Oracle跨库访问DBLINK使用以及实际应用

    这篇文章主要给大家介绍了关于Oracle跨库访问DBLINK使用以及实际应用的相关资料,DBLink的作用是在局域网内,通过一台服务器上面的数据库访问另外一台服务器上面数据库的功能,需要的朋友可以参考下
    2024-01-01

最新评论