2015-03-11 1 views
2

J'ai un projet de base de données Visual Studio sur une base de données SQL Server 2014. J'ai besoin de créer une table enfant pour une table parent existante. Le parent a déjà la colonne de clé étrangère et j'ai besoin d'ajouter la contrainte à la nouvelle table parent (le FK est sur l'enfant et pointant vers le parent). Je voudrais préserver les données.Ajout d'une contrainte de clé étrangère à une table existante avec des données dans un projet de base de données Visual Studio

Actuellement, le processus de déploiement crée la nouvelle table et la clé étrangère. Le script de post-déploiement ajoute les enregistrements enfants à la nouvelle table enfant.

Mon problème est que le FK échoue parce que les enregistrements enfants n'ont pas été ajoutés. Je ne peux pas ajouter les enregistrements enfants dans le pré-déploiement, car la table n'existe pas à ce stade.

Je ne peux pas désactiver la contrainte dans le pré-déploiement car elle est créée dans le déploiement.

Cela semble être un phénomène courant. Y a-t-il un moyen établi de le faire?

+0

Besoin de clarification. 'Je dois ajouter la contrainte à la nouvelle table parent' Vous voulez dire à la nouvelle table * child *? 'le FK échoue parce que les enregistrements enfants n'ont pas été ajoutés. Cela ne devrait pas arriver, sauf si vous mettez la contrainte sur la table parente qui semble en arrière. – Keith

+0

Vous avez raison. J'ai mis à jour les questions. –

+0

Vous pouvez éviter ce problème (et bien d'autres) en mettant la contrainte FK dans la table enfant. La table parente ne doit pas avoir de références aux tables enfant sinon vous créez une situation de type "qui est venu en premier, la poule ou l'œuf". – Keith

Répondre

2

Cela ne devrait pas être un problème. Par défaut, un projet de base de données crée des contraintes avec l'option NoCheck, ce qui signifie que SQL Server ne validera pas les données. Ensuite, après postDeploy, il vérifiera la contrainte. Jetez un coup d'oeil sur votre script de déploiement et il va valider cela.