Question

Je suis sûr que cela pourrait être tout à fait requête commune mais n'a pas pu trouver une bonne réponse que pour l'instant.

Voici ma question:

J'ai une table nommée Contacts avec la colonne varchar Titre . Maintenant, au milieu du développement, je veux remplacer champ Titre avec TitleID qui est la clé étrangère à ContactTitles tableau . A la table moment Contacts a plus de 60 dépendances (autres tables, fonctions de vues).

Comment puis-je faire que la façon la plus sûre et la plus facile?

Nous utilisons: MSSQL 2005, les données ont déjà été migré, veulent juste schéma de changement

.

Modifier:

Merci à tous pour la relecture rapide.

Comme il a été mentionné Contacts table a plus de 60 personnes à charge, mais lorsque la requête suivante a été exécuté, seulement 5 d'entre eux utilisent Titre colonne. Le script de migration a été exécuté, donc pas de données modifications nécessaires.

/*gets all objects which use specified column */

SELECT Name FROM syscomments sc JOIN sysobjects so ON sc.id = so.id WHERE TEXT LIKE '%Title%' AND TEXT LIKE '%TitleID%'

Alors je suis allé à travers ces 5 vues et les mises à jour manuellement.

Était-ce utile?

La solution

Pour Microsoft SQL Server Redgate ont un produit (pas libre) qui peuvent aider à ce refactoring http://www.red-gate.com/products/sql_refactor/index.htm

Dans le passé, j'ai réussi à le faire assez facilement (si primitively) en obtenant simplement une liste de choses à l'examen

SELECT * FROM sys.objects
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%Contacts%' 

(et éventuellement de prendre des informations de dépendances en compte et le filtrage par type d'objet)

Scripting tous ceux d'intérêt dans Management Studio, puis aller tout simplement la liste et les passer en revue tous et changer le créer pour modifier. Il devrait être assez simple et le changement répétitif même pour 60 dépendances possibles. En outre, si vous faites référence à une colonne non existante, vous devriez obtenir un message d'erreur lorsque vous exécutez le script de modifier.

Si vous utilisez * dans vos requêtes SQL ou adhoc dans vos applications évidemment des choses peut être un peu plus difficile.

Autres conseils

Utilisez refactoring méthodes . Commencez par créer un nouveau champ appelé TitleID, puis copiez tous les titres dans la table ContactTitles. Puis, un par un, mettez à jour chacune des dépendances à utiliser le champ TitleID. Assurez-vous que vous avez encore un système de travail après chaque étape.

Si les données va changer, vous devez être prudent et assurez-vous que toutes les modifications apportées à la colonne Title changent aussi la table ContactTitles. Vous ne devez les garder synchronisés pendant que vous faites le refactoring.

Modifier Il y a même un livre à ce sujet! refactorisation Bases de données .

Comme d'autres ont indiqué que cela dépend de votre SGBDR.

Il existe deux approches:

  • faire un changement à la table et fixer toutes les dépendances
  • vue que vous pouvez utiliser au lieu d'un accès direct à la table (cela peut vous prémunir contre les changements futurs dans le tableau de base sous-jacente (s), mais vous risquez de perdre certaines fonctionnalités de mise à jour, en fonction de votre SGBD)

Utiliser « Nom Table » SP_Depend pour vérifier les dépendances de la table puis utilisez les sp_rename pour renommer le nom de la colonne qui est très utile. sp_rename renomme automatiquement l'index associé chaque fois qu'une clé primaire ou UNIQUE est renommé. Si un indice est renommé lié à une contrainte de clé primaire, la contrainte de clé primaire est également renommé automatiquement par sp_rename.

et puis commencer la procédure de mise à jour et fonctions, un par un, il n'y a aucune autre bonne option pour le changement comme celui-ci si vous découvriez Alors dites-moi aussi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top