oracle数据库禁用/启用外键和触发器的存储过程

平时我们在批量处理表数据的时候,经常因为外键的存在影响进度,下面分别是禁用所有外键和触发器的,和启用所有外键和触发器的存储过程,当我们需要对表数据进行更新时,先执行禁用的存储过程,完成之后在执行启用的存储过程即可,希望对大家有所帮助。
1.禁用所有外键和触发器的存储过程

create or replace procedure p_aaa_disable_trig_fk(p_in       in varchar2  ) is

  v_sql         varchar2(1000);
  v_ref         sys_refcursor;
  v_ref2        sys_refcursor;
  v_sql2        varchar2(1000);
begin
  for v_ref in (select object_name
                  from user_objects
                 where object_type = 'TRIGGER') loop
    v_sql := 'alter trigger ' || v_ref.object_name || ' disable';  --将disable改为enable为启用

    execute immediate v_sql;
    dbms_output.put_line(v_sql);
  end loop;    

  for v_ref2 in (select  table_name,constraint_name
       from user_constraints where constraint_type='R' ) loop
    v_sql2 := 'alter table '||v_ref2.table_name||' disable constraint '||v_ref2.constraint_name;  --将disable改为enable为启用

    execute immediate v_sql2;
    dbms_output.put_line(v_sql2);
  end loop;

exception
  when others then
    dbms_output.put_line(SQLCODE || ' ' || SQLERRM);

end p_aaa_disable_trig_fk;

2.启用所有外键和触发器的存储过程(其实就是将1中的distable换为enable)

 create or replace procedure p_aaa_enable_trig_fk(p_in       in varchar2  ) is

 v_sql        varchar2(1000);
  v_ref        sys_refcursor;
  v_ref2        sys_refcursor;
  v_sql2        varchar2(1000);
begin
  for v_ref in (select object_name
                  from user_objects
                 where object_type = 'TRIGGER') loop
    v_sql := 'alter trigger ' || v_ref.object_name || ' enable';  --将disable改为enable为启用

    execute immediate v_sql;
    dbms_output.put_line(v_sql);
  end loop;  

  for v_ref2 in (select  table_name,constraint_name
       from user_constraints where constraint_type='R' ) loop
    v_sql2 := 'alter table '||v_ref2.table_name||' enable constraint '||v_ref2.constraint_name;  --将disable改为enable为启用

    execute immediate v_sql2;
    dbms_output.put_line(v_sql2);
  end loop;

exception
  when others then
    dbms_output.put_line(SQLCODE || ' ' || SQLERRM);

end p_aaa_enable_trig_fk;

亲测有效,希望对大家有所帮助!

你可能感兴趣的:(存储过程)