Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cara Mengaktifkan Batasan CHECK di SQL Server (Contoh T-SQL)

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hubungkan SQL Server ke HubSpot CRM

  2. Fungsi Agregat MIN dan MAX di SQL Server

  3. Mengapa Anda membuat Tampilan dalam database?

  4. Izin EXECUTE ditolak pada objek 'xxxxxxx', basis data 'zzzzzzz', skema 'dbo'

  5. Pernyataan INSERT bertentangan dengan batasan FOREIGN KEY - SQL Server