Jika Anda memiliki batasan kunci asing di SQL Server yang saat ini dinonaktifkan, Anda dapat menggunakan kode di bawah ini untuk mengaktifkannya kembali.
Saat Anda mengaktifkan batasan kunci asing, Anda memiliki opsi untuk menentukan apakah akan memeriksa data yang ada dalam tabel atau tidak. Ini juga berlaku saat Anda mengaktifkan CHECK
kendala.
Di bawah ini adalah contoh kode untuk mengaktifkan batasan kunci asing, sambil menentukan masing-masing opsi yang berbeda ini.
Contoh 1 – Mengaktifkan Batasan menggunakan WITH CHECK
Ini adalah metode yang disarankan (kecuali Anda memiliki alasan khusus untuk tidak menggunakannya).
Berikut adalah contoh mengaktifkan batasan kunci asing yang disebut FK_Albums_Artists
:
ALTER TABLE Albums WITH CHECK CHECK CONSTRAINT FK_Albums_Artists;
Di sini saya secara eksplisit menyatakan WITH CHECK
, yang memberi tahu SQL Server untuk memeriksa data yang ada sebelum mengaktifkan batasan. Jika ada data yang melanggar batasan, batasan tidak akan diaktifkan dan Anda akan mendapatkan error.
Ini bagus, karena menerapkan integritas referensial.
Saat Anda membuat batasan kunci asing baru, ini adalah pengaturan default. Namun, saat Anda mengaktifkan batasan yang ada (seperti yang kami lakukan di sini), itu tidak pengaturan default.
Contoh 2 – Mengaktifkan Batasan menggunakan WITH NOCHECK
Dalam contoh ini batasan diaktifkan tanpa memeriksa data yang ada:
ALTER TABLE Albums WITH NOCHECK CHECK CONSTRAINT FK_Albums_Artists;
Di sini saya secara eksplisit menyatakan WITH NOCHECK
, yang memberi tahu SQL Server untuk tidak memeriksa data yang ada. Artinya constraint akan diaktifkan meskipun tabel sudah berisi data yang melanggar constraint.
Ini adalah pengaturan default saat mengaktifkan batasan (tetapi tidak saat membuatnya).
Salah satu dari beberapa alasan (mungkin satu-satunya alasan) Anda akan menggunakan ini adalah jika Anda ingin menyimpan data yang tidak valid dalam database. Mungkin Anda memiliki pengecualian satu kali di mana Anda harus memasukkan satu baris atau lebih data yang tidak valid, tetapi Anda memerlukan semua data yang akan datang agar sesuai dengan batasan.
Namun, masih ada risiko yang terkait dengan melakukan ini. Inilah yang Microsoft katakan tentang ini:
Kami tidak menyarankan melakukan ini, kecuali dalam kasus yang jarang terjadi. Batasan baru dievaluasi di semua pembaruan data selanjutnya. Pelanggaran batasan apa pun yang ditekan oleh
WITH NOCHECK
saat batasan ditambahkan dapat menyebabkan pembaruan di masa mendatang gagal jika memperbarui baris dengan data yang tidak mengikuti batasan.
Jadi gunakan WITH NOCHECK
berpotensi menyebabkan masalah di kemudian hari.
Contoh 3 – Mengaktifkan Batasan menggunakan Opsi Default
Berikut ini contoh menggunakan opsi default:
ALTER TABLE Albums CHECK CONSTRAINT FK_Albums_Artists;
Contoh ini sama dengan contoh sebelumnya. Karena saya tidak menentukan apakah akan memeriksa atau tidak, SQL Server menganggap saya ingin WITH NOCHECK
.
Jadi pastikan untuk secara eksplisit menentukan WITH CHECK
jika Anda ingin menghindari masalah integritas referensial.
Menggunakan DENGAN NOCHECK Menghapus Kepercayaan
Saat Anda mengaktifkan batasan menggunakan (default) WITH NOCHECK
, satu konsekuensi yang harus Anda waspadai adalah bahwa SQL Server tidak akan lagi mempercayai batasan itu. Ini menandainya sebagai tidak tepercaya. Sebenarnya, itu sudah ditandai sebagai tidak tepercaya saat Anda menonaktifkan batasan.
SQL Server memiliki is_not_trusted
bendera yang disetel ke 1
saat Anda menonaktifkan batasan kunci asing (yang berarti tidak tepercaya), dan satu-satunya cara untuk menyetelnya ke 0
(tepercaya) adalah menentukan WITH CHECK
saat mengaktifkan kembali batasan. Di sisi lain, menggunakan WITH NOCHECK
cukup aktifkan tanpa memeriksa data yang ada.
Dengan menggunakan WITH CHECK
, Anda memastikan bahwa batasan memeriksa semua data yang ada sebelum diaktifkan. Satu-satunya cara itu dapat diaktifkan adalah jika semua data yang ada sesuai dengan batasan. Setelah memeriksa semua data yang ada, batasan tersebut kemudian dapat dipercaya.
Contoh 4 – Periksa Status Tepercaya/Dinonaktifkan
Anda dapat memeriksa status tepercaya dan dinonaktifkan dengan menanyakan sys.foreign_keys
tampilan sistem.
Seperti ini:
SELECT name AS 'Constraint', is_disabled, is_not_trusted FROM sys.foreign_keys;
Hasil:
+-------------------+---------------+------------------+ | Constraint | is_disabled | is_not_trusted | |-------------------+---------------+------------------| | FK_Albums_Artists | 0 | 1 | | FK_Albums_Genres | 0 | 0 | +-------------------+---------------+------------------+
Ini memberi tahu saya bahwa batasan yang saya aktifkan pada contoh sebelumnya ( FK_Albums_Artists ) tidak dipercaya.
Ini karena saya mengaktifkannya menggunakan pengaturan default, yaitu WITH NOCHECK
.
Jika saya mengaktifkannya kembali menggunakan WITH CHECK
, inilah yang terjadi:
ALTER TABLE Albums WITH CHECK CHECK CONSTRAINT FK_Albums_Artists; SELECT name AS 'Constraint', is_disabled, is_not_trusted FROM sys.foreign_keys;
Hasil:
+-------------------+---------------+------------------+ | Constraint | is_disabled | is_not_trusted | |-------------------+---------------+------------------| | FK_Albums_Artists | 0 | 0 | | FK_Albums_Genres | 0 | 0 | +-------------------+---------------+------------------+
Untungnya dalam hal ini saya tidak memiliki data yang melanggar batasan, sehingga batasan berhasil diaktifkan dan kepercayaannya dipulihkan.
Jika ada data yang melanggar batasan, kesalahan akan ditampilkan, dan saya akan dipaksa untuk memperbaiki data sebelum dapat memulihkan kepercayaan pada batasan.