Jika Anda memiliki CHECK
kendala di SQL Server yang saat ini dinonaktifkan, Anda dapat menggunakan kode di bawah ini untuk mengaktifkannya kembali.
Saat Anda mengaktifkan CHECK
batasan (atau batasan kunci asing dalam hal ini), Anda memiliki opsi untuk menentukan apakah akan memeriksa data yang ada di tabel atau tidak.
Di bawah ini adalah contoh kode untuk mengaktifkan CHECK
batasan, sambil menentukan masing-masing opsi yang berbeda ini.
Contoh 1 – Mengaktifkan Batasan menggunakan WITH CHECK
Ini adalah metode yang disarankan untuk mengaktifkan CHECK
batasan (kecuali Anda memiliki alasan khusus untuk tidak menggunakannya).
Berikut adalah contoh mengaktifkan batasan yang disebut chkJobTitle
:
ALTER TABLE Occupation WITH CHECK CHECK CONSTRAINT chkJobTitle;
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 data.
Saat Anda membuat CHECK
baru kendala, 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 Occupation WITH NOCHECK CHECK CONSTRAINT chkJobTitle;
Di sini saya secara eksplisit menyatakan WITH NOCHECK
, yang memberi tahu SQL Server untuk tidak memeriksa data yang ada. Ini berarti batasan akan diaktifkan meskipun tabel sudah berisi data yang melanggar batasan.
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 Occupation CHECK CONSTRAINT chkJobTitle;
Contoh ini sama dengan contoh sebelumnya. Karena saya tidak menentukan apakah akan memeriksa atau tidak, SQL Server menganggap saya ingin WITH NOCHECK
.
Menggunakan DENGAN NOCHECK Menghapus Kepercayaan
Saat Anda mengaktifkan batasan menggunakan WITH NOCHECK
, satu konsekuensi yang harus Anda waspadai adalah bahwa SQL Server tidak lagi mempercayai batasan itu. Ini menandainya sebagai tidak tepercaya.
Ya Anda membacanya dengan benar. Sebenarnya ada is_not_trusted
tandai bahwa SQL Server disetel ke 1
saat Anda menonaktifkan CHECK
kendala (yang berarti tidak tepercaya), dan satu-satunya cara untuk menyetelnya ke 0
(tepercaya) adalah menentukan WITH CHECK
saat mengaktifkan kembali batasan. Menggunakan WITH NOCHECK
hanya tidak memotongnya.
Ini masuk akal. Lagi pula, maukah Anda mempercayai kendala yang belum memeriksa semua data?
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, maka dapat dipercaya.
Untuk lebih lanjut tentang ini, lihat Apa yang Harus Anda Ketahui tentang WITH NOCHECK saat Mengaktifkan Batasan CHECK di SQL Server, di mana Anda dapat melihat is_not_trusted
yang sebenarnya bendera sedang di-toggle bolak-balik setiap kali saya menonaktifkan dan mengaktifkan kembali CHECK
kendala.