2010-05-06 4 views
0

Bien, comme un client veut automatiser un certain processus, qui comprend la création d'une nouvelle structure de clé dans une base de données LIVE, j'ai besoin de créer des relations entre tables.columns. Maintenant, j'ai trouvé les tables ALL_CONS_COLS et USER_CONSTRAINTS pour contenir des informations sur les contraintes. Si je devais créer manuellement des contraintes, en les insérant dans ces tables, je devrais pouvoir recréer les contraintes d'origine. Ma question: y a-t-il d'autres tables sur lesquelles je devrais me pencher? Avez-vous d'autres suggestions, étant donné que cela semble TRÈS sale et que vous êtes sujet à des erreurs?Oracle ajouter manuellement une contrainte FK

du modus operandi actuel:

  • Créer une nouvelle colonne dans chaque table pour le PK;

  • Générer un guid pour cette PK;

  • Créer une nouvelle colonne dans chaque table pour les FK;

  • Récupérer le guid associé au
    FK;

....... fait sofar ......

  • Ajouter une nouvelle contrainte basée sur l'ancienne
    un;

  • Supprimer l'ancienne contrainte;

  • Renommer les nouvelles colonnes;

Ceci est un peu douteux et je préfère changer ma méthode, toutes les idées seraient utiles. Pour le dire autrement, le client veut changer la structure de clé de int en guid sur une base de données en direct. Quelle est la meilleure façon d'aborder cela

Répondre

4

Tout d'abord, vous ne créez pas/modifiez/supprimez des contraintes en jouant avec le dictionnaire de données, mais avec la syntaxe régulière ALTER TABLE t ADD/MODIFY/DROP CONSTRAINT.

Dans votre scénario, je pense que vous devriez utiliser le scénario suivant:

1) Assurez-vous que personne ne modifie les données alors que cette opération se passe

2) Laissez tomber les vieilles clés étrangères d'abord à évitez le conflit de noms avec les nouvelles contraintes.

3) Laissez tomber les vieilles contraintes de clé primaire

4) Créer les nouvelles contraintes de clé primaire sur les colonnes guid

5) Créer les nouvelles clés étrangères

Et puis vous avez terminé.

Cordialement, Rob.

+0

D'accord, ALTER TABLE, mais comment l'automatiser pour copier des relations existantes? La seule façon que je puisse imaginer est d'interroger les relations dans la table all_cons_cols et user_constraints, en en faire une copie, pour les nouvelles colonnes et DROPping les anciennes. – Oxymoron

+0

Créez un script qui génère les commandes pour vous. Quelque chose comme "select" alter table '|| nom_table ||' drop constraint '|| nom_contrainte ||'; ' from user_constraints où constraint_type = 'P' "pour supprimer toutes les clés primaires. Et quelque chose de similaire à supprimer les clés étrangères et à créer les nouvelles contraintes. –

+0

J'ai donc besoin d'user la table user_constraints exactement comme je le fais maintenant;) Sachez que nous parlons d'une base de données en direct, avec des enregistrements. La désactivation ou la suppression ne sera pas facilement possible en raison de références. – Oxymoron

Questions connexes