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

Cara Mengaktifkan Semua Batasan PERIKSA &Kunci Asing untuk Tabel di SQL Server (Contoh T-SQL)

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 untuk ConstraintTest 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 dan WITH NOCHECK untuk orang lain).

Lihat Cara Mengaktifkan Batasan CHECK di SQL Server dan Cara Mengaktifkan Kunci Asing di SQL Server.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server Inner Join Basics with Contoh

  2. Offset Baris di SQL Server

  3. Masukkan semua data datagridview ke database sekaligus

  4. Bagaimana Anda mengimpor file .sql MS SQL yang besar?

  5. Buat Query di SQL Server 2017