SQL Server’da bir tablodaki Check kısıtlarını ve Foreign Key kısıtlarını NOCHECK ifadesini kullanarak askıya almanız mümkün.
Neden bunu yapmaya ihtiyaç duyasınız?
Mesela zaten doğru olduğunu bildiğiniz toplu bir veri aktarımı olacaksa… Ya da doğru olmadığını bildiğiniz birtakım verilerin sonradan temizlenmek üzere bir an önce tabloya dahil edilmesi gerekiyorsa…
Tamam, kısıtı devre dışı bıraktınız ve verileri aldınız. Sonradan işiniz bitti ve kısıtı tekrar etkin hale getirmek istiyorsunuz. Bunu yaparken mevcut satırları check ederek ya da etmeden aktif hale getirme şansınız var. Verileri zaten düzelttiyseniz ve uyuyor olduğunu biliyorsanız belki de kontrol etmeden aktif hale getirmeyi tercih edebilirsiniz. Ama orada durun! Bir sakıncası var!
SQL Server sorgu optimizasyonu sırasında kısıtları kullanabilir. Mesela bir kolonun değerinin 5’le 10 arasında olabileceği gibi bir kısıtınız varsa ve 4’ten küçük diye bir sorgu gelirse, kısıttan dolayı böyle bir satır olamayacağını bilerek hızla cevap dönebilir. Ya da normalde dönebilir. Eğer ilgili kısıtı askıya almış ve sonrada yeniden devreye alırken mevcut satırları kontrol ettirmemişseniz, bu optimizasyonu yapamaz. Çünkü kısıta güvenemez.
Hem sys.check_constraints hem de sys.foreign_keys’te is_not_trusted kolonu bu bilgiyi gösterir.
Kısıtlarla oynamak, sınırlarda dolaşmanın her zaman getirebileceği birtakım risklere sahip gördüğünüz gibi…