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

Cara Mengaktifkan Semua CEK &Batasan Kunci Asing dalam Database di SQL Server (Contoh T-SQL)

Anda dapat menggunakan kode di bawah ini untuk mengaktifkan semua CHECK dan batasan kunci asing untuk database saat ini di SQL Server.

Saat Anda mengaktifkan CHECK atau batasan kunci asing, Anda memiliki opsi untuk memeriksa data yang ada di tabel sebelum batasan diaktifkan. Melakukan hal ini memungkinkan Anda untuk memverifikasi apakah ada yang melanggar batasan atau tidak. Untuk melakukan pemeriksaan ini, gunakan WITH CHECK di dalam kode, jika tidak gunakan WITH NOCHECK .

Kode Contoh

Berikut cara mengaktifkan semua CHECK dan batasan kunci asing dalam database. Contoh pertama memeriksa data yang ada, yang kedua tidak.

Dengan Centang (disarankan):

EXEC sp_MSforeachtable "ALTER TABLE ? WITH CHECK CONSTRAINT ALL"

Tanpa Cek:

EXEC sp_MSforeachtable "ALTER TABLE ? WITH NOCHECK CHECK CONSTRAINT ALL"

Anda juga dapat secara eksplisit memberikan nama argumen (@command1 ) jika Anda mau (Anda akan mendapatkan hasil yang sama).

Dengan Cek:

EXEC sp_MSforeachtable @command1="ALTER TABLE ? WITH CHECK CONSTRAINT ALL"

Tanpa Cek:

EXEC sp_MSforeachtable @command1="ALTER TABLE ? WITH CHECK CONSTRAINT ALL"

Contoh-contoh ini menggunakan sp_MSforeachtable (tidak berdokumen) prosedur tersimpan. Prosedur ini memungkinkan Anda untuk melakukan tugas terhadap setiap tabel dalam database. Jadi ini sempurna untuk tugas kita di sini – untuk mengaktifkan semua CHECK dan batasan kunci asing dalam database saat ini.

Di bawah ini adalah contoh di mana saya melakukan ini dan kemudian memeriksa hasilnya.

Contoh 1 – Tinjau Batasan

Pertama, saya akan melihat sekilas CHECK saat ini dan batasan kunci asing 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 | 1 | 1 |+----------------+-----------------+------------ ---+------------------+

Jadi saat ini ada empat CHECK kendala kendala dalam database, untuk dua tabel yang berbeda.

Kita dapat melihat bahwa semua batasan dinonaktifkan, karena is_disabled disetel ke 1 .

Selain itu, semuanya tidak tepercaya, karena is_not_trusted juga disetel ke 1 .

Contoh 2 – Aktifkan Batasan menggunakan WITH CHECK

Sekarang saya akan mengaktifkan semua batasan menggunakan WITH CHECK argumen:

EXEC sp_MSforeachtable "ALTER TABLE ? WITH CHECK CONSTRAINT ALL"

Itu selalu merupakan ide yang baik untuk memastikan Anda menggunakan database yang benar saat melakukan hal semacam ini. Jadi kita bisa memodifikasi kode dengan terlebih dahulu beralih ke database yang benar:

USE Test;EXEC sp_MSforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL"

Dalam hal ini saya beralih ke database bernama Test sebelum menjalankan prosedur tersimpan.

Contoh 3 – Periksa Hasilnya

Setelah menjalankan kode di atas, sekarang saya akan menjalankan 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 |+----------------+-------+------------ ---+------------------+

Jadi semua kendala dalam database sekarang telah diaktifkan (karena is_disabled kolom disetel ke 0 untuk semua kendala).

Kita juga dapat melihat bahwa is_not_trusted kolom juga disetel ke 0 . Ini berarti kendala dipercaya. Terpercaya, karena kami memintanya untuk memeriksa semua data yang ada sebelum diaktifkan.

Jika saya menggunakan WITH NOCHECK , batasannya akan tetap tidak tepercaya (yaitu is_not_trusted mereka bendera akan disetel ke 1 ). Ini karena database berpotensi berisi data yang melanggar satu (atau lebih) batasan (data yang tidak valid dapat masuk ke database saat batasan dinonaktifkan).

Pada kesempatan langka, Anda mungkin perlu menyimpan data yang tidak valid dalam database. Dalam kasus seperti itu, batasan harus tetap tidak dipercaya, karena data yang ada tidak akan lulus pemeriksaan awal dan oleh karena itu batasan tidak akan dapat diaktifkan kecuali jika menggunakan WITH NOCHECK .

Lihat Apa yang Harus Anda Ketahui tentang WITH NOCHECK saat Mengaktifkan Batasan CHECK di SQL Server untuk contoh mendetail tentang peralihan antara tepercaya dan tidak tepercaya saat menonaktifkan dan mengaktifkan kembali batasan.

Aktifkan Batasan Secara Individual

Jika Anda hanya ingin mengaktifkan batasan satu per satu, 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. Artefak hilang com.microsoft.sqlserver:sqljdbc4:jar:4.0

  2. Cara memetakan bidang entitas yang namanya adalah kata yang dicadangkan di JPA

  3. Tidak dapat masuk ke SQL Server + Otentikasi SQL Server + Kesalahan:18456

  4. Optimalisasi kueri SQL:Praktik terbaik untuk meningkatkan kinerja

  5. Tidak ada kebuntuan SQL berdasarkan desain - ada pola pengkodean?