Anda dapat menggunakan kode di bawah ini untuk mengaktifkan semua CHECK
dan batasan kunci asing untuk tabel tertentu di SQL Server.
Saat Anda mengaktifkan batasan di SQL Server, Anda perlu memutuskan apakah itu harus memeriksa data yang ada atau tidak. Ini menjadi pertimbangan penting jika tabel sudah berisi data, karena data yang ada berpotensi melanggar aturan batasan.
Contoh Pernyataan
Di bawah ini adalah dua contoh pernyataan yang menunjukkan perbedaan antara memeriksa data yang ada dan tidak memeriksanya saat Anda mengaktifkan batasan.
Untuk memeriksa data yang ada, gunakan WITH CHECK
dalam pernyataan Anda saat mengaktifkan batasan, jika tidak gunakan WITH NOCHECK
.
Dengan Cek:
ALTER TABLE TableName WITH CHECK CONSTRAINT ALL
Tanpa Cek:
ALTER TABLE TableName WITH NOCHECK CHECK CONSTRAINT ALL
Ganti saja TableName
dengan nama tabel yang berlaku.
Di bawah ini adalah contoh di mana saya melakukan ini dan memeriksa hasilnya.
Contoh 1 – Tinjau Batasan
Pertama, saya akan melihat sekilas CHECK
saat ini kendala dalam database, untuk melihat apakah mereka diaktifkan atau dinonaktifkan.
SELECT OBJECT_NAME(parent_object_id) AS 'Table', nama AS 'Constraint', is_disabled, is_not_trustedFROM sys.foreign_keysUNIONSELECT OBJECT_NAME(parent_object_id), nama, is_disabled, is_not_trustedFROM sys.check Hasil:+----------------+-------+----------- ----+------------------+| Tabel | Batasan | is_disable | is_not_trusted ||----------------+-------+------------ ---+------------------|| Uji Kendala | chkHarga | 1 | 1 || Uji Kendala | chkValidEndDate | 1 | 1 || Uji Kendala | chkTeamSize | 1 | 1 || Pekerjaan | chkJobTitle | 0 | 0 |+----------------+-------+------------ ---+------------------+Jadi saat ini ada empat
CHECK
batasan dalam database, tiga di antaranya untukConstraintTest
tabel.Kita dapat melihat bahwa semua batasan untuk tabel dinonaktifkan karena is_disabled disetel ke 1 .
Kita juga dapat melihat bahwa is_not_trusted kolom disetel ke 1 untuk kendala ini. Ini berarti bahwa mereka tidak dipercaya. Mereka tidak dapat dipercaya saat dinonaktifkan, karena data yang tidak valid dapat masuk ke database tanpa diperiksa. Selengkapnya di bawah ini.
Batasan lainnya (untuk tabel lain) sudah diaktifkan dan dipercaya (tetapi kita dapat mengabaikan tabel/batasan tersebut dalam artikel ini).
Contoh 2 – Aktifkan Batasan menggunakan WITH CHECK
Sekarang saya akan mengaktifkan semua batasan untuk
ConstraintTest
tabel:ALTER TABLE ConstraintTest WITH CHECK CHECK CONSTRAINT ALL;Itu saja – selesai.
Sekarang mari kita jalankan kueri yang sama dari contoh pertama untuk melihat hasilnya.
SELECT OBJECT_NAME(parent_object_id) AS 'Table', nama AS 'Constraint', is_disabled, is_not_trustedFROM sys.foreign_keysUNIONSELECT OBJECT_NAME(parent_object_id), nama, is_disabled, is_not_trustedFROM sys.check Hasil:+----------------+-------+----------- ----+------------------+| Tabel | Batasan | is_disable | is_not_trusted ||----------------+-------+------------ ---+------------------|| Uji Kendala | chkHarga | 0 | 0 || Uji Kendala | chkValidEndDate | 0 | 0 || Uji Kendala | chkTeamSize | 0 | 0 || Pekerjaan | chkJobTitle | 0 | 0 |+----------------+-------+------------ ---+------------------+Ketiga batasan untuk ConstraintTest tabel sekarang diaktifkan dan dipercaya.
Mereka dipercaya karena saya menggunakan
WITH CHECK
dalam pernyataan saya. Jika tidak, saya akan mendapatkan hasil yang berbeda, seperti yang Anda lihat di bawah.Dengan menggunakan
WITH CHECK
, saya dapat yakin bahwa data apa pun yang ada dalam tabel sebenarnya sesuai dengan batasan.Contoh 3 – Aktifkan Batasan menggunakan WITH NOCHECK
Sekarang saya akan mengaktifkan kembali batasan menggunakan
WITH CHECK
jadi kita bisa melihat bagaimana hal ini mempengaruhi hasil.Tapi pertama-tama saya harus menonaktifkannya:
ALTER TABLE ConstraintTest NOCHECK CONSTRAINT ALL;Periksa apakah mereka dinonaktifkan:
SELECT OBJECT_NAME(parent_object_id) AS 'Table', nama AS 'Constraint', is_disabled, is_not_trustedFROM sys.foreign_keysUNIONSELECT OBJECT_NAME(parent_object_id), nama, is_disabled, is_not_trustedFROM sys.check Hasil:+----------------+-------+----------- ----+------------------+| Tabel | Batasan | is_disable | is_not_trusted ||----------------+-------+------------ ---+------------------|| Uji Kendala | chkHarga | 1 | 1 || Uji Kendala | chkValidEndDate | 1 | 1 || Uji Kendala | chkTeamSize | 1 | 1 || Pekerjaan | chkJobTitle | 0 | 0 |+----------------+-------+------------ ---+------------------+Jadi mereka dinonaktifkan sekali lagi.
Sekarang aktifkan kembali menggunakan
WITH NOCHECK
:ALTER TABLE ConstraintTest WITH NOCHECK CHECK CONSTRAINT ALL;Periksa lagi:
SELECT OBJECT_NAME(parent_object_id) AS 'Table', nama AS 'Constraint', is_disabled, is_not_trustedFROM sys.foreign_keysUNIONSELECT OBJECT_NAME(parent_object_id), nama, is_disabled, is_not_trustedFROM sys.check Hasil:+----------------+-------+----------- ----+------------------+| Tabel | Batasan | is_disable | is_not_trusted ||----------------+-------+------------ ---+------------------|| Uji Kendala | chkHarga | 0 | 1 || Uji Kendala | chkValidEndDate | 0 | 1 || Uji Kendala | chkTeamSize | 0 | 1 || Pekerjaan | chkJobTitle | 0 | 0 |+----------------+-------+------------ ---+------------------+Kita dapat melihat bahwa batasan telah berhasil diaktifkan, tetapi kali ini tetap tidak dipercaya.
Batasan tidak dipercaya karena tidak memeriksa data yang ada sebelum diaktifkan.
Jadi kuncinya di sini adalah, jika Anda ingin batasan Anda dipercaya, pastikan untuk menggunakan
WITH CHECK
saat mengaktifkannya.Mengaktifkan Batasan Secara Individual
Jika Anda tidak ingin mengaktifkan semua batasan sekaligus, Anda dapat mengaktifkannya satu per satu. Ini juga dapat berguna jika Anda perlu mengaktifkan semua batasan, tetapi Anda perlu menggunakan setelan yang berbeda (mis.
WITH CHECK
untuk beberapa danWITH NOCHECK
untuk orang lain).Lihat Cara Mengaktifkan Batasan CHECK di SQL Server dan Cara Mengaktifkan Kunci Asing di SQL Server.