使用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语句?
答案 0 :(得分:7)
USER_CONSTRAINTS
是一个视图,您无法以普通用户身份进行更新。编辑:即使SYS不能这样做,对数据字典进行更新对我来说似乎是一个非常糟糕的主意。
答案 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;