Jika Anda berada dalam situasi di mana Anda perlu menonaktifkan batasan kunci asing di SQL Server, berikut cara melakukannya menggunakan Transact-SQL.
Ini akan memungkinkan Anda untuk memasukkan data tanpa dibatasi oleh kunci asing. Jelas, Anda tidak akan melakukan ini kecuali Anda memiliki alasan yang sangat bagus untuk melakukannya. Kunci asing menegakkan integritas referensial, sehingga menonaktifkannya berpotensi menciptakan segala macam masalah.
Contoh 1 – Nonaktifkan Batasan Kunci Asing
Untuk menonaktifkan batasan kunci asing, gunakan NOCHECK
argumen dalam ALTER TABLE
pernyataan.
Seperti ini:
ALTER TABLE BandMember NOCHECK CONSTRAINT FK_BandMember_Musician;
Kode ini menonaktifkan batasan kunci asing yang disebut FK_BandMember_Musician .
Contoh 2 – Tinjau Batasan
Kita dapat menanyakan sys.foreign_keys
tampilan sistem untuk memverifikasi bahwa batasan kami telah dinonaktifkan:
SELECT name AS 'Constraint', is_disabled, is_not_trusted FROM sys.foreign_keys;
Hasil:
+--------------------------------+---------------+------------------+ | Constraint | is_disabled | is_not_trusted | |--------------------------------+---------------+------------------| | FK_BandMember_Band | 0 | 0 | | FK_BandMember_Musician | 1 | 1 | | FK_MembershipPeriod_BandMember | 0 | 0 | +--------------------------------+---------------+------------------+
Dalam hal ini saya memilih semua batasan kunci asing dari database saat ini.
Kita dapat melihat bahwa ini adalah satu-satunya yang dinonaktifkan (karena is_disabled kolom disetel ke 1 ).
Anda mungkin memperhatikan bahwa is_not_trusted kolom juga disetel ke 1 . Hal ini menunjukkan bahwa kendala belum diverifikasi oleh sistem.
Ini masuk akal, karena kita tidak bisa lagi berasumsi bahwa batasan telah memeriksa semua data. Fakta bahwa batasan dinonaktifkan berarti bahwa data sekarang dapat masuk ke database tanpa diperiksa oleh batasan. Oleh karena itu, ada potensi data yang tidak valid ada di database.
Jika Anda perlu mengaktifkan kembali batasan, Anda akan memiliki kesempatan untuk memulihkan kepercayaan batasan (dengan menggunakan WITH CHECK
pilihan). Ini akan memeriksa semua baris yang ada sebelum mengaktifkan batasan.
Anda juga akan memiliki opsi untuk tidak memeriksa data yang ada, tetapi ini hanya boleh dilakukan dalam kasus yang jarang terjadi.
Ini kueri yang sama lagi, tetapi dengan beberapa kolom tambahan untuk menampilkan tabel dan tabel yang direferensikan:
SELECT name AS 'Constraint', OBJECT_NAME(parent_object_id) AS 'Table', OBJECT_NAME(referenced_object_id) AS 'Referenced Table', is_disabled, is_not_trusted FROM sys.foreign_keys;
Hasil:
+--------------------------------+------------------+---------------------+---------------+------------------+ | Constraint | Table | Referenced Table | is_disabled | is_not_trusted | |--------------------------------+------------------+---------------------+---------------+------------------| | FK_BandMember_Band | BandMember | Band | 0 | 0 | | FK_BandMember_Musician | BandMember | Musician | 1 | 1 | | FK_MembershipPeriod_BandMember | MembershipPeriod | BandMember | 0 | 0 | +--------------------------------+------------------+---------------------+---------------+------------------+