У меня две таблицы в двух разных базах данных. В таблице table1 (в базе данных 1) есть столбец с именем column1, и это первичный ключ. Теперь в таблице 2 (в базе данных 2) есть столбец с именем column2, и я хочу добавить его в качестве внешнего ключа.
Я попытался добавить его, и это дало мне следующую ошибку:
Msg 1763, уровень 16, состояние 0, строка 1
Ссылки на внешние ключи между базами данных не поддерживаются. Внешний ключ Database2.table2.Сообщение 1750, уровень 16, состояние 0, строка 1
Не удалось создать ограничение. См. Предыдущие ошибки.
Как мне это сделать, поскольку таблицы находятся в разных базах данных.
Если вам нужна надежная целостность, поместите обе таблицы в одну базу данных и используйте ограничение FK. Если ваша родительская таблица находится в другой базе данных, ничто не мешает кому-либо восстановить эту родительскую базу данных из старой резервной копии, и тогда у вас останутся сироты.
Вот почему FK между базами данных не поддерживается.
источник
По моему опыту, лучший способ справиться с этим, когда основной авторитетный источник информации для двух связанных таблиц должен находиться в двух отдельных базах данных, - это синхронизировать копию таблицы из основного расположения во вторичное расположение (используя T- SQL или SSIS с соответствующей проверкой ошибок - вы не можете усечь и повторно заполнить таблицу, пока она имеет ссылку на внешний ключ, поэтому есть несколько способов избавиться от кошки при обновлении таблицы).
Затем добавьте традиционную связь FK во втором месте таблицы, которая фактически является копией только для чтения.
Вы можете использовать триггер или запланированное задание в основном расположении, чтобы обновлять копию.
источник
Вы можете использовать ограничение проверки с пользовательской функцией, чтобы выполнить проверку. Он надежнее спускового крючка. Его можно отключить и снова включить при необходимости, как и внешние ключи, и перепроверить после восстановления базы данных2.
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)
источник
Короткий ответ заключается в том, что SQL Server (начиная с SQL 2008) не поддерживает внешние ключи между базами данных, как указано в сообщении об ошибке.
Хотя у вас не может быть декларативной ссылочной целостности (FK), вы можете достичь той же цели с помощью триггеров. Это немного менее надежно, потому что в написанной вами логике могут быть ошибки, но она все равно приведет вас туда.
См. Документы SQL @ http://msdn.microsoft.com/en-us/library/aa258254%28v=sql.80%29.aspx В каком состоянии:
В SQLTeam также есть обсуждение ОК - http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=31135
источник
Как говорится в сообщении об ошибке, это не поддерживается на сервере sql. Единственный способ обеспечить референциальную целостность - работать с триггерами.
источник