2009-11-18 2 views
1

En utilisant Oracle 10g, j'ai besoin de renommer un tas de contraintes FK qui se terminent toutes en LITE pour inclure un préfixe FK.Un problème avec le changement de nom des contraintes Oracle directement dans la table user_constraint?

Ma pensée a été (je l'ai assuré que tous les noms sont suffisamment courts pour accueillir le préfixe):

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; 

Toute raison pour laquelle ce serait dangereux et je devrais avoir à créer les instructions alter table au lieu?

+0

Qu'est-ce qui ne va pas avec ALTER TABLE? – DCookie

Répondre

7

USER_CONSTRAINTS est une vue, vous ne pouvez pas la mettre à jour en tant qu'utilisateur normal. EDIT: Même SYS ne peut pas faire cela, et faire des mises à jour sur le dictionnaire de données me semble être une très mauvaise idée.

Better use ALTER TABLE xxx RENAME CONSTRAINT yyy TO zzz;

+0

+1: ne JAMAIS mettre à jour le dictionnaire de données directement (sauf indication explicite du support) –

+0

+1, sans mentionner que vous ne savez pas à quelles relations ce nom de contrainte participe dans le dictionnaire. – DCookie

+0

+1 de moi ........ –

4

Comme le dit ammoQ, ne pense même pas à le faire! C'est le code équivalent utilisant 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; 
Questions connexes