Tenho duas tabelas em dois bancos de dados diferentes. Na tabela1 (no banco de dados1), existe uma coluna chamada coluna1 e é uma chave primária. Agora, na tabela2 (no banco de dados2), há uma coluna chamada coluna2 e quero adicioná-la como uma chave estrangeira.
Tentei adicioná-lo e deu-me o seguinte erro:
Msg 1763, nível 16, estado 0, linha 1
Não há suporte para referências de chave externa entre bancos de dados. Chave estrangeira Database2.table2.Msg 1750, nível 16, estado 0, linha 1
Não foi possível criar restrição. Veja os erros anteriores.
Como faço isso, já que as tabelas estão em bancos de dados diferentes.
Se você precisar de integridade sólida como uma rocha, tenha as duas tabelas em um banco de dados e use uma restrição FK. Se sua tabela pai estiver em outro banco de dados, nada impede que alguém restaure esse banco de dados pai de um backup antigo e, então, você terá órfãos.
É por isso que FK entre bancos de dados não é compatível.
fonte
Na minha experiência, a melhor maneira de lidar com isso quando a fonte principal de informação autorizada para duas tabelas relacionadas tem que estar em dois bancos de dados separados é sincronizar uma cópia da tabela do local principal para o local secundário (usando T- SQL ou SSIS com verificação de erros apropriada - você não pode truncar e preencher novamente uma tabela enquanto ela tem uma referência de chave estrangeira, portanto, existem algumas maneiras de remover o problema da atualização da tabela).
Em seguida, adicione um relacionamento FK tradicional no segundo local à tabela, que é efetivamente uma cópia somente leitura.
Você pode usar um gatilho ou trabalho agendado no local principal para manter a cópia atualizada.
fonte
Você pode usar a restrição de verificação com uma função definida pelo usuário para fazer a verificação. É mais confiável do que um gatilho. Ele pode ser desativado e reativado quando necessário, da mesma forma que as chaves estrangeiras, e verificado novamente após uma restauração do banco de dados2.
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)
fonte
A resposta curta é que o SQL Server (a partir do SQL 2008) não oferece suporte a chaves estrangeiras entre bancos de dados - como afirma a mensagem de erro.
Embora você não possa ter integridade referencial declarativa (o FK), você pode atingir o mesmo objetivo usando gatilhos. É um pouco menos confiável, porque a lógica que você escreve pode ter bugs, mas levará você lá da mesma forma.
Consulte os documentos SQL @ http://msdn.microsoft.com/en-us/library/aa258254%28v=sql.80%29.aspx Qual estado:
Há também uma discussão OK em SQLTeam - http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=31135
fonte
Como diz a mensagem de erro, isso não é compatível com o servidor sql. A única maneira de garantir integridade refrerencial é trabalhar com gatilhos.
fonte