Любая проблема с переименованием ограничений Oracle непосредственно в таблице user_constraint? - PullRequest
1 голос
/ 18 ноября 2009

Используя 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 ]

7 голосов
/ 18 ноября 2009

USER_CONSTRAINTS - это вид, вы не можете обновить его как обычный пользователь. РЕДАКТИРОВАТЬ: Даже SYS не может этого сделать, и внесение изменений в словарь данных кажется мне невероятно плохой идеей.

Лучше использовать ALTER TABLE xxx RENAME CONSTRAINT yyy TO zzz;

4 голосов
/ 18 ноября 2009

Как говорит 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...