94 votes

Puis-je avoir une clé étrangère référençant une colonne dans une vue dans SQL Server?

Dans SQL Server 2008 et donné

 TableA(A_ID, A_Data)
TableB(B_ID, B_Data)
ViewC(A_or_B_ID, A_or_B_Data)
 

Est-il possible de définir TableZ(A_or_B_ID, Z_Data) sorte que la colonne Z.A_or_B_ID soit limitée aux valeurs trouvées dans ViewC ? Cela peut-il être fait avec une clé étrangère contre la vue?

128voto

Brian Fisher Points 10755

Vous ne pouvez pas référencer une vue dans une clé étrangère.

32voto

lorin_f Points 61

Dans les éditions SQL Server antérieures, les clés étrangères n'étaient possibles que par des déclencheurs. Vous pouvez reproduire une clé étrangère personnalisée en créant un déclencheur d’insertion qui vérifie si la valeur insérée apparaît également dans l’un des tableaux pertinents.

19voto

Damien_The_Unbeliever Points 102139

Si vous avez vraiment besoin d' A_or_B_ID dans TableZ, vous avez deux options:

1) Ajouter nullable A_ID et B_ID colonnes au tableau z, faire A_or_B_ID une colonne calculée à l'aide de la fonction ISNULL sur ces deux colonnes, et d'ajouter une contrainte de VÉRIFICATION telle que seul l'un d' A_ID ou B_ID n'est pas null

2) Ajouter une colonne nom de la table à la table z, limitées pour contenir Un ou B. maintenant, créez A_ID et B_ID comme des colonnes calculées, qui ne sont que des non-null lorsque leur table est nommée (à l'aide de CAS de l'expression). Les rendre persistantes trop

Dans les deux cas, vous disposez maintenant d' A_ID et B_ID colonnes qui peuvent avoir étrangères touches pour les tables de base. La différence est dans les colonnes calculées. Aussi, vous n'avez pas besoin de nom de la table dans l'option 2 ci-dessus si les domaines de la 2 ID colonnes ne pas se chevaucher aussi longtemps que votre cas l'expression peut déterminer le domaine qui A_or_B_ID tombe dans

(Merci de commenter pour la fixation de ma mise en forme)

8voto

Jarrett Meyer Points 11147

Désolé, vous ne pouvez pas accéder à une vue dans SQL Server avec FK.

5voto

ErikE Points 18233

Il est une autre option. Traiter TableA et TableB en tant que sous-classes d'une nouvelle table appelée TablePrime. Ajuster la TableB de valeurs d'ID de sorte qu'ils ne coïncident pas avec les TableA de valeurs d'ID. Rendre l'ID dans TablePrime PK et insérer l'ensemble des TableA et TableB (ajusté) IDs dans TablePrime. Faire TableA et TableB ont FK relations sur leur PK à la même ID dans TablePrime.

Vous avez maintenant le supertype/sous-type de motif, et peut rendre les contraintes de TablePrime (quand vous voulez -Un-ou-B) ou de l'une des tables individuelles (quand vous voulez seulement Un ou uniquement B).

Si vous avez besoin de plus de détails s'il vous plaît demander. Il y a des variations qui vous permettra assurez-vous que A et B sont mutuellement exclusifs, ou peut-être la chose que vous travaillez avec peut être les deux en même temps. Il est préférable de formaliser que dans le FKs si possible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X