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

Cara Mengaktifkan Batasan Kunci Asing di SQL Server (Contoh T-SQL)

Jika Anda memiliki batasan kunci asing di SQL Server yang saat ini dinonaktifkan, Anda dapat menggunakan kode di bawah ini untuk mengaktifkannya kembali.

Saat Anda mengaktifkan batasan kunci asing, Anda memiliki opsi untuk menentukan apakah akan memeriksa data yang ada dalam tabel atau tidak. Ini juga berlaku saat Anda mengaktifkan CHECK kendala.

Di bawah ini adalah contoh kode untuk mengaktifkan batasan kunci asing, sambil menentukan masing-masing opsi yang berbeda ini.

Contoh 1 – Mengaktifkan Batasan menggunakan WITH CHECK

Ini adalah metode yang disarankan (kecuali Anda memiliki alasan khusus untuk tidak menggunakannya).

Berikut adalah contoh mengaktifkan batasan kunci asing yang disebut FK_Albums_Artists :

ALTER TABLE Albums 
WITH CHECK CHECK CONSTRAINT FK_Albums_Artists; 

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 referensial.

Saat Anda membuat batasan kunci asing baru, 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 Albums 
WITH NOCHECK CHECK CONSTRAINT FK_Albums_Artists;

Di sini saya secara eksplisit menyatakan WITH NOCHECK , yang memberi tahu SQL Server untuk tidak memeriksa data yang ada. Artinya constraint akan diaktifkan meskipun tabel sudah berisi data yang melanggar constraint.

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 Albums 
CHECK CONSTRAINT FK_Albums_Artists;

Contoh ini sama dengan contoh sebelumnya. Karena saya tidak menentukan apakah akan memeriksa atau tidak, SQL Server menganggap saya ingin WITH NOCHECK .

Jadi pastikan untuk secara eksplisit menentukan WITH CHECK jika Anda ingin menghindari masalah integritas referensial.

Menggunakan DENGAN NOCHECK Menghapus Kepercayaan

Saat Anda mengaktifkan batasan menggunakan (default) WITH NOCHECK , satu konsekuensi yang harus Anda waspadai adalah bahwa SQL Server tidak akan lagi mempercayai batasan itu. Ini menandainya sebagai tidak tepercaya. Sebenarnya, itu sudah ditandai sebagai tidak tepercaya saat Anda menonaktifkan batasan.

SQL Server memiliki is_not_trusted bendera yang disetel ke 1 saat Anda menonaktifkan batasan kunci asing (yang berarti tidak tepercaya), dan satu-satunya cara untuk menyetelnya ke 0 (tepercaya) adalah menentukan WITH CHECK saat mengaktifkan kembali batasan. Di sisi lain, menggunakan WITH NOCHECK cukup aktifkan tanpa memeriksa data yang ada.

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, batasan tersebut kemudian dapat dipercaya.

Contoh 4 – Periksa Status Tepercaya/Dinonaktifkan

Anda dapat memeriksa status tepercaya dan dinonaktifkan dengan menanyakan sys.foreign_keys tampilan sistem.

Seperti ini:

SELECT 
  name AS 'Constraint',
  is_disabled,
  is_not_trusted
FROM sys.foreign_keys;

Hasil:

+-------------------+---------------+------------------+
| Constraint        | is_disabled   | is_not_trusted   |
|-------------------+---------------+------------------|
| FK_Albums_Artists | 0             | 1                |
| FK_Albums_Genres  | 0             | 0                |
+-------------------+---------------+------------------+

Ini memberi tahu saya bahwa batasan yang saya aktifkan pada contoh sebelumnya ( FK_Albums_Artists ) tidak dipercaya.

Ini karena saya mengaktifkannya menggunakan pengaturan default, yaitu WITH NOCHECK .

Jika saya mengaktifkannya kembali menggunakan WITH CHECK , inilah yang terjadi:

ALTER TABLE Albums 
WITH CHECK CHECK CONSTRAINT FK_Albums_Artists;

SELECT 
  name AS 'Constraint',
  is_disabled,
  is_not_trusted
FROM sys.foreign_keys;

Hasil:

+-------------------+---------------+------------------+
| Constraint        | is_disabled   | is_not_trusted   |
|-------------------+---------------+------------------|
| FK_Albums_Artists | 0             | 0                |
| FK_Albums_Genres  | 0             | 0                |
+-------------------+---------------+------------------+

Untungnya dalam hal ini saya tidak memiliki data yang melanggar batasan, sehingga batasan berhasil diaktifkan dan kepercayaannya dipulihkan.

Jika ada data yang melanggar batasan, kesalahan akan ditampilkan, dan saya akan dipaksa untuk memperbaiki data sebelum dapat memulihkan kepercayaan pada batasan.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pengidentifikasi multi-bagian tidak dapat diikat

  2. Membuat Rencana Pemeliharaan di SQL Server

  3. 4 Cara untuk Mengetahui Kolom Apa yang Akan Dikembalikan oleh Prosedur Tersimpan di SQL Server

  4. Menavigasi Log Kesalahan SQL Server

  5. Cara Memeriksa Apakah Database SQL Rusak – Solusi untuk Memperbaiki File MDF