ITPub博客

首页 > 数据库 > Oracle > Oracle '批量'禁用外键的存储过程

Oracle '批量'禁用外键的存储过程

原创 Oracle 作者:maohaiqing0304 时间:2015-06-12 10:55:39 0 删除 编辑


标题:Oracle '批量'禁用外键的存储过程 

作者:lōττéry©版权所有[文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.]


 CREATE OR REPLACE PROCEDURE P_CONSTRAINT(V_TYPE VARCHAR2) IS
 
  ----------P_CONSTRAINT(外键约束禁用、启用 '适用于truncate table 报ORA-02266错时用到')-------------

  /*----------------------------------------------------------
  | AUTHOR:毛海晴                                           |          
  | USERS :外键约束禁用、启用'清空数据时用到'               |
  | BLOG  : http://blog.itpub.net/28602568/viewspace-1696583/|
  -----------------------------------------------------------*/
  /*
  注释:
  由于在TRUNCATE表数据时有主外键约束,所以要将外键约束禁用。
  判断约束是否是外键有2种:
    1、USER_CONSTRAINTS视图中约束类型CONSTRAINT_TYPE = 'R';
    2、R_CONSTRAINT_NAME IS NOT NULL;
  
  */
  P_SQL_ENABLE      VARCHAR2(1000);
  P_SQL_DISABLE     VARCHAR2(1000);
  P_TABLE_NAME      VARCHAR2(1000);
  P_CONSTRAINT_NAME VARCHAR2(1000);

  /*
  USER_CONSTRAINTS : 用户的对象约束信息
   CONSTRAINT_TYPE:
   P:主键;
   R:外键
   C:非空约束/CHECK;
   */
  --外键STATUS非DISABLED的表/约束.
  CURSOR C_CONS_DISABLE IS
    SELECT TABLE_NAME, CONSTRAINT_NAME
      FROM USER_CONSTRAINTS C
     WHERE C.CONSTRAINT_TYPE = 'R'
       AND C.STATUS != 'DISABLED';
  --外键STATUS非ENABLED的表/约束.
  CURSOR C_CONS_ENABLE IS
    SELECT TABLE_NAME, CONSTRAINT_NAME
      FROM USER_CONSTRAINTS C
     WHERE C.CONSTRAINT_TYPE = 'R'
       AND C.STATUS != 'ENABLED';
BEGIN
  ---如果选择‘禁用’则调用以下循环. 将所有查出状态为ENABLED 改为DISABLED状态
  IF V_TYPE = '禁用' THEN
    FOR P_C_CONS_DISABLE IN C_CONS_DISABLE LOOP
      P_TABLE_NAME      := P_C_CONS_DISABLE.TABLE_NAME;
      P_CONSTRAINT_NAME := P_C_CONS_DISABLE.CONSTRAINT_NAME;
    
      P_SQL_DISABLE := 'ALTER TABLE ' || P_TABLE_NAME ||
                       ' DISABLE CONSTRAINT ' || P_CONSTRAINT_NAME || '';
      --DBMS_OUTPUT.PUT_LINE(P_SQL_DISABLE);
      EXECUTE IMMEDIATE P_SQL_DISABLE;
    END LOOP;
  END IF;
  ---如果选择‘启用’则调用以下循环.将所有查出状态为DISABLED 改为ENABLED状态
  IF V_TYPE = '启用' THEN
    FOR P_C_CONS_ENABLE IN C_CONS_ENABLE LOOP
      P_TABLE_NAME      := P_C_CONS_ENABLE.TABLE_NAME;
      P_CONSTRAINT_NAME := P_C_CONS_ENABLE.CONSTRAINT_NAME;
    
      P_SQL_ENABLE := 'ALTER TABLE ' || P_TABLE_NAME ||
                      ' ENABLE CONSTRAINT ' || P_CONSTRAINT_NAME || '';
      --DBMS_OUTPUT.PUT_LINE(P_SQL_ENABLE);
      EXECUTE IMMEDIATE P_SQL_ENABLE;
    END LOOP;
  END IF;
END P_CONSTRAINT;


*** 本文针对整个用户进行全部禁用外键,若有需要对表做过滤,可在本博客基础上改写..

  【源于本人笔记】 若有书写错误,表达错误,请指正...


此条目发表在   SQL、SQL优化篇  分类目录。将固定连接加入收藏夹。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28602568/viewspace-1696583/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: Oracle SQL优化总结
请登录后发表评论 登录
全部评论
.

注册时间:2013-03-13

  • 博文量
    117
  • 访问量
    2626236