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
.