直接在user_constraint表中重命名Oracle约束的任何问题?

时间:2009-11-18 16:18:24

标签: oracle plsql oracle10g

使用Oracle 10g,我需要重命名一堆FK约束,这些约束都以 LITE结尾,包含一个FK 前缀。

我的想法是(我确保所有名字都足够短以容纳前缀):

DECLARE
  v_name VARCHAR2(30 BYTE);
  v_new_name VARCHAR2(30 BYTE);
  CURSOR c1 is select CONSTRAINT name from user_constraints where constraint_type = 'R' and constraint_name like '%_LITE';
BEGIN
   OPEN c1;
   LOOP
      FETCH c1 into v_name;
      EXIT when c1%NOTFOUND;
      v_new_name:= 'FK_' || v_name;
      update user_constraints SET constraint_name = v_new_name where constraint_name = v_name;
   END LOOP;
   close c1;
END;

为什么这样会不安全,我应该改为创建alter table语句?

2 个答案:

答案 0 :(得分:7)

USER_CONSTRAINTS是一个视图,您无法以普通用户身份进行更新。编辑:即使SYS不能这样做,对数据字典进行更新对我来说似乎是一个非常糟糕的主意。

Better use ALTER TABLE xxx RENAME CONSTRAINT yyy TO zzz;

答案 1 :(得分:4)

正如ammoQ所说,甚至不考虑这样做!这是使用ALTER TABLE的等效代码:

BEGIN
   FOR r IN (select constraint_name 
             from user_constraints 
             where constraint_type = 'R'
             and constraint_name like '%_LITE'
            )
   LOOP
      EXECUTE IMMEDIATE 'ALTER TABLE ' || r.table_name 
         || ' RENAME CONSTRAINT ' || r.constraint_name 
         || ' TO FK_' ||v_new_name;
   END LOOP;
END;