J'ai deux tables dans deux bases de données différentes. Dans table1 (dans database1), il y a une colonne appelée column1 et c'est une clé primaire. Maintenant, dans table2 (dans database2), il y a une colonne appelée column2 et je veux l'ajouter en tant que clé étrangère.
J'ai essayé de l'ajouter et cela m'a donné l'erreur suivante:
Msg 1763, niveau 16, état 0, ligne 1
Les références de clé étrangère entre bases de données ne sont pas prises en charge. Clé étrangère Database2.table2.Msg 1750, niveau 16, état 0, ligne 1
Impossible de créer la contrainte. Voir les erreurs précédentes.
Comment puis-je faire cela puisque les tables sont dans des bases de données différentes.
Si vous avez besoin d'une intégrité à toute épreuve, placez les deux tables dans une seule base de données et utilisez une contrainte FK. Si votre table parente se trouve dans une autre base de données, rien n'empêche quiconque de restaurer cette base de données parente à partir d'une ancienne sauvegarde, et vous avez alors des orphelins.
C'est pourquoi FK entre les bases de données n'est pas pris en charge.
la source
D'après mon expérience, la meilleure façon de gérer cela lorsque la principale source d'informations faisant autorité pour deux tables liées doit se trouver dans deux bases de données distinctes est de synchroniser une copie de la table de l'emplacement principal vers l'emplacement secondaire (en utilisant T- SQL ou SSIS avec vérification des erreurs appropriée - vous ne pouvez pas tronquer et repeupler une table alors qu'elle a une référence de clé étrangère, il existe donc plusieurs façons de skinner le chat sur la mise à jour de la table).
Ajoutez ensuite une relation FK traditionnelle au deuxième emplacement de la table qui est en fait une copie en lecture seule.
Vous pouvez utiliser un déclencheur ou une tâche planifiée dans l'emplacement principal pour maintenir la copie à jour.
la source
Vous pouvez utiliser la contrainte de vérification avec une fonction définie par l'utilisateur pour effectuer la vérification. C'est plus fiable qu'un déclencheur. Il peut être désactivé et réactivé si nécessaire comme les clés étrangères et revérifié après une restauration de base de données2.
CREATE FUNCTION dbo.fn_db2_schema2_tb_A (@column1 INT) RETURNS BIT AS BEGIN DECLARE @exists bit = 0 IF EXISTS ( SELECT TOP 1 1 FROM DB2.SCHEMA2.tb_A WHERE COLUMN_KEY_1 = @COLUMN1 ) BEGIN SET @exists = 1 END; RETURN @exists END GO ALTER TABLE db1.schema1.tb_S ADD CONSTRAINT CHK_S_key_col1_in_db2_schema2_tb_A CHECK(dbo.fn_db2_schema2_tb_A(key_col1) = 1)
la source
La réponse courte est que SQL Server (à partir de SQL 2008) ne prend pas en charge les clés étrangères entre bases de données, comme l'indique le message d'erreur.
Bien que vous ne puissiez pas avoir d'intégrité référentielle déclarative (le FK), vous pouvez atteindre le même objectif en utilisant des déclencheurs. C'est un peu moins fiable, car la logique que vous écrivez peut avoir des bogues, mais elle vous y mènera tout de même.
Consultez la documentation SQL @ http://msdn.microsoft.com/en-us/library/aa258254%28v=sql.80%29.aspx Quel état:
Il y a aussi une discussion OK sur SQLTeam - http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=31135
la source
Comme le message d'erreur l'indique, cela n'est pas pris en charge sur le serveur SQL. Le seul moyen d'assurer l'intégrité référentielle est de travailler avec des déclencheurs.
la source