Saya memiliki dua tabel dalam dua database yang berbeda. Dalam tabel1 (dalam database1) ada kolom yang disebut kolom1 dan itu adalah kunci utama. Sekarang di tabel2 (di database2) ada kolom bernama kolom2 dan saya ingin menambahkannya sebagai kunci asing.
Saya mencoba menambahkannya dan itu memberi saya kesalahan berikut:
Psn 1763, Level 16, Status 0, Baris 1
Referensi kunci asing lintas database tidak didukung. Database2.table2 kunci asing.Msg 1750, Level 16, Status 0, Baris 1
Tidak dapat membuat batasan. Lihat kesalahan sebelumnya.
Bagaimana saya melakukannya karena tabel berada dalam database yang berbeda.
Jika Anda membutuhkan integritas yang kokoh, miliki kedua tabel dalam satu database, dan gunakan batasan FK. Jika tabel induk Anda ada di database lain, tidak ada yang mencegah siapa pun memulihkan database induk tersebut dari cadangan lama, dan kemudian Anda memiliki yatim piatu.
Inilah mengapa FK antar database tidak didukung.
sumber
Menurut pengalaman saya, cara terbaik untuk menangani ini ketika sumber informasi otoritatif utama untuk dua tabel yang terkait harus berada dalam dua database terpisah adalah dengan menyinkronkan salinan tabel dari lokasi utama ke lokasi sekunder (menggunakan T- SQL atau SSIS dengan pemeriksaan kesalahan yang sesuai - Anda tidak dapat memotong dan mengisi kembali tabel saat tabel memiliki referensi kunci asing, jadi ada beberapa cara untuk mengupdate kucing pada tabel).
Kemudian tambahkan hubungan FK tradisional di lokasi kedua ke tabel yang secara efektif merupakan salinan hanya-baca.
Anda dapat menggunakan pemicu atau pekerjaan terjadwal di lokasi utama untuk terus memperbarui salinan.
sumber
Anda dapat menggunakan kendala pemeriksaan dengan fungsi yang ditentukan pengguna untuk melakukan pemeriksaan. Ini lebih dapat diandalkan daripada pemicu. Ini dapat dinonaktifkan dan diaktifkan kembali bila diperlukan sama seperti kunci asing dan diperiksa ulang setelah pemulihan database2.
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)
sumber
Jawaban singkatnya adalah bahwa SQL Server (pada SQL 2008) tidak mendukung kunci asing database silang - seperti yang dinyatakan dalam pesan kesalahan.
Meskipun Anda tidak dapat memiliki integritas referensial deklaratif (FK), Anda dapat mencapai tujuan yang sama menggunakan pemicu. Ini agak kurang dapat diandalkan, karena logika yang Anda tulis mungkin memiliki bug, tetapi itu akan membawa Anda ke sana sama saja.
Lihat dokumen SQL @ http://msdn.microsoft.com/en-us/library/aa258254%28v=sql.80%29.aspx Status mana:
Ada juga diskusi OK di SQLTeam - http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=31135
sumber
Seperti pesan kesalahan mengatakan, ini tidak didukung di sql server. Satu-satunya cara untuk memastikan integritas referential adalah bekerja dengan pemicu.
sumber