Mam dwie tabele w dwóch różnych bazach danych. W tabeli1 (baza danych1) znajduje się kolumna o nazwie kolumna1 i jest to klucz podstawowy. Teraz w table2 (w database2) jest kolumna o nazwie column2 i chcę ją dodać jako klucz obcy.
Próbowałem go dodać i dał mi następujący błąd:
Msg 1763, poziom 16, stan 0, wiersz 1
Odwołania do kluczy obcych między bazami danych nie są obsługiwane. Klucz obcy Database2.table2.Msg 1750, poziom 16, stan 0, wiersz 1
Nie można utworzyć ograniczenia. Zobacz poprzednie błędy.
Jak to zrobić, skoro tabele znajdują się w różnych bazach danych.
Jeśli potrzebujesz solidnej integralności, miej obie tabele w jednej bazie danych i użyj ograniczenia FK. Jeśli twoja tabela nadrzędna znajduje się w innej bazie danych, nic nie stoi na przeszkodzie, aby ktokolwiek mógł przywrócić tę nadrzędną bazę danych ze starej kopii zapasowej, a wtedy masz sieroty.
Z tego powodu FK między bazami danych nie jest obsługiwany.
źródło
Z mojego doświadczenia wynika, że najlepszym sposobem rozwiązania tego problemu, gdy główne autorytatywne źródło informacji dla dwóch powiązanych tabel musi znajdować się w dwóch oddzielnych bazach danych, jest zsynchronizowanie kopii tabeli z lokalizacji podstawowej do lokalizacji dodatkowej (przy użyciu T- SQL lub SSIS z odpowiednim sprawdzaniem błędów - nie można obcinać i ponownie zapełniać tabeli, gdy ma ona odniesienie do klucza obcego, więc istnieje kilka sposobów na skórowanie kota przy aktualizacji tabeli).
Następnie dodaj tradycyjną relację FK w drugiej lokalizacji do tabeli, która jest faktycznie kopią tylko do odczytu.
Możesz użyć wyzwalacza lub zaplanowanego zadania w lokalizacji podstawowej, aby aktualizować kopię.
źródło
Możesz użyć ograniczenia sprawdzającego z funkcją zdefiniowaną przez użytkownika, aby dokonać sprawdzenia. Jest bardziej niezawodny niż spust. W razie potrzeby można go wyłączyć i ponownie włączyć, tak samo jak klucze obce i ponownie sprawdzić po przywróceniu bazy danych2.
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)
źródło
Krótka odpowiedź jest taka, że SQL Server (od wersji SQL 2008) nie obsługuje kluczy obcych między bazami danych - jak stwierdza komunikat o błędzie.
Chociaż nie możesz mieć deklaratywnej integralności referencyjnej (FK), możesz osiągnąć ten sam cel za pomocą wyzwalaczy. Jest to trochę mniej niezawodne, ponieważ logika, którą piszesz, może zawierać błędy, ale tak samo Cię tam zaprowadzi.
Zobacz dokumentację SQL @ http://msdn.microsoft.com/en-us/library/aa258254%28v=sql.80%29.aspx Który stan:
Istnieje również dobra dyskusja w SQLTeam - http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=31135
źródło
Jak mówi komunikat o błędzie, nie jest to obsługiwane na serwerze sql. Jedynym sposobem na zapewnienie integralności odniesienia jest praca z wyzwalaczami.
źródło