2010-09-13 12 views
9

Je suis en train de faire une migration en masse d'une grande base de données Oracle. La première étape consiste à renommer toute une série de tables afin de pouvoir les supprimer plus tard (mais je dois conserver les données pour le moment). Toutes les contraintes de clé étrangère sur eux doivent être supprimées - ils ne doivent pas être connectés au reste de la base de données du tout. Si je les abandonnais maintenant, je pourrais faire face à des contraintes, mais le renommage modifie simplement les contraintes.Oracle - supprimer les contraintes de la table sans supprimer de tables

Existe-t-il un moyen de supprimer toutes les contraintes que CASCADE CONSTRAINTS supprimerait sans abandonner la table elle-même?

Répondre

18

Vous pouvez le faire avec SQL dynamique et le dictionnaire de données:

begin 
    for r in (select table_name, constraint_name 
       from user_constraints 
       where constraint_type = 'R') 
    loop 
     execute immediate 'alter table '||r.table_name 
          ||' drop constraint '||r.constraint_name; 
    end loop; 
end loop; 

Si les tables appartiennent à plus d'un utilisateur, vous aurez besoin de conduire de DBA_CONSTRAINTS et comprennent PROPRIÉTAIRE dans la projection et l'exécution déclaration. Si vous voulez toucher moins que toutes les tables, je crains que vous ayez besoin de spécifier la liste dans la clause WHERE, à moins qu'il y ait un motif à leurs noms.

+0

Ça a l'air bien. J'ai ajouté quelques contraintes pour refléter les tables que je veux modifier et je suis parti avec ça. Merci! – Submonoid

0

Vous pouvez désactiver/réactiver les contraintes sans les supprimer. Jetez un oeil à this article.

+0

C'est vrai, mais ça ne m'aide pas vraiment. Je pourrais contourner les contraintes individuelles, mais c'est une grosse base de données et je ne veux pas aller chercher toutes les contraintes qui référencent les tables que je déplace. Je veux être en mesure de supprimer automatiquement toutes les contraintes de la même manière que je le pourrais si j'utilisais 'DROP TABLE foo CASCADE CONTRAINTES'. – Submonoid

Questions connexes