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

Cara Mengembalikan Kepercayaan dalam Batasan Kunci Asing di SQL Server (Contoh T-SQL)

Di SQL Server, batasan kunci asing (dan CHECK kendala) dapat dipercaya atau tidak dipercaya.

Ketika kendala dipercaya, ini berarti kendala telah diverifikasi oleh sistem. Saat tidak dipercaya, batasannya tidak telah diverifikasi oleh sistem.

Pada dasarnya, ketika Anda memiliki batasan yang tidak tepercaya, Anda juga dapat memiliki data yang tidak valid di database Anda. Maksud saya, Anda dapat memiliki data yang melanggar batasan.

Ini berarti bahwa Anda tidak lagi mempertahankan integritas referensial dalam hubungan Anda, yang biasanya bukan praktik yang baik saat menjaga database relasional dalam produksi.

Dalam artikel ini saya akan memeriksa batasan yang ada untuk "kepercayaan" mereka, dan kemudian saya akan memperbaruinya agar dapat dipercaya sekali lagi.

Contoh 1 – Tinjau Kendala yang Ada

Anda dapat mengetahui apakah suatu kendala dipercaya atau tidak 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 | 1             | 1                |
| FK_Albums_Genres  | 0             | 1                |
+-------------------+---------------+------------------+

Oke, jadi ini memberi tahu saya bahwa saya memiliki dua batasan kunci asing dan keduanya tidak tepercaya.

Salah satu batasan dinonaktifkan, jadi masuk akal jika batasan tersebut tidak dipercaya (data yang buruk dapat masuk ke database setiap kali batasan dinonaktifkan).

Tetapi batasan lainnya diaktifkan, jadi itu tidak boleh tidak dipercaya. Menjadi tidak tepercaya berarti mungkin ada data yang tidak valid dalam database. Bukan berarti ada data tidak valid, hanya saja bisa menjadi.

Pada dasarnya, dengan diaktifkan, itu akan memeriksa data yang akan datang, tetapi tidak dapat menjamin data yang ada. Jika suatu kendala dipercaya, maka Anda dapat yakin bahwa semua data yang ada adalah valid.

Hanya Kembalikan Batasan Tidak Tepercaya

Anda mungkin lebih suka menggunakan WHERE klausa untuk mengembalikan hanya batasan yang tidak dipercaya. Seperti ini:

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

Hasil:

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

Jadi dalam hal ini hasilnya sama (karena semua kendala saat ini tidak tepercaya).

Contoh 2 – Pulihkan Kepercayaan

Untuk memulihkan kepercayaan ke batasan yang diaktifkan, cukup aktifkan kembali saat menggunakan WITH CHECK pilihan.

Seperti ini:

ALTER TABLE Albums 
WITH CHECK CHECK CONSTRAINT FK_Albums_Genres;

Sekarang ketika kita menanyakan sys.foreign_keys kita mendapatkan hasil yang berbeda:

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

Hasil:

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

Kita dapat melihat bahwa kendala sekarang dipercaya, karena is_not_trusted bendera disetel ke 0 .

Contoh 3 – Bagaimana Batasan menjadi Tidak Tepercaya?

Saat Anda menonaktifkan batasan kunci asing, itu secara otomatis menjadi tidak tepercaya. Saat Anda mengaktifkan kembali batasan yang sama, Anda memiliki kesempatan untuk memulihkan kepercayaannya. Jika Anda tidak melakukan ini, itu akan tetap tidak dipercaya.

Saat Anda mengaktifkan batasan kunci asing, Anda memiliki opsi untuk menentukan WITH CHECK atau WITH NOCHECK . Jika Anda menentukan nanti, batasan Anda akan tetap tidak dipercaya setelah diaktifkan.

Penting untuk diperhatikan bahwa WITH NOCHECK adalah opsi default, jadi jika Anda tidak secara eksplisit menentukan bahwa itu harus dipercaya, batasan akan diaktifkan sebagai tidak tepercaya.

Namun, sebaliknya ketika Anda membuat batasan kunci asing. Saat Anda pertama kali membuat batasan, opsi defaultnya adalah WITH CHECK . Jadi jika Anda menghilangkan pengaturan ini, itu akan dipercaya secara default (kecuali Anda memiliki data yang tidak valid, dalam hal ini tidak akan diaktifkan). Namun, Anda dapat mengganti setelan ini dengan secara eksplisit menetapkan WITH NOCHECK saat Anda membuat batasan.

Untuk mendemonstrasikan bagaimana batasan yang diaktifkan dapat dengan mudah tetap tidak dipercaya, saya akan mengaktifkan kembali kunci lainnya (yang dinonaktifkan), tetapi saya akan menggunakan pengaturan default:

ALTER TABLE Albums 
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             | 1                |
| FK_Albums_Genres  | 0             | 0                |
+-------------------+---------------+------------------+

Jadi dengan menjadi malas (atau pelupa) dan tidak secara eksplisit menentukan WITH CHECK , saya berhasil mengaktifkan batasan sambil menjaga status "tidak tepercaya" tetap utuh.

Pengambilan kunci dari ini adalah:jika Anda ingin batasan yang diaktifkan kembali dipercaya, Anda harus selalu mengaktifkannya menggunakan WITH CHECK .


  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 (TSQL) - Apakah mungkin untuk membuat pernyataan EXEC secara paralel?

  2. Menggunakan merge..output untuk mendapatkan pemetaan antara source.id dan target.id

  3. Sintaks gabungan mana yang lebih baik?

  4. Cara tercepat untuk menentukan apakah ada catatan

  5. Pernyataan SQL GROUP BY CASE dengan fungsi agregat