Yabancı anahtar kısıtlamaları T-SQL kullanılarak nasıl geçici olarak devre dışı bırakılabilir?

SQL Server'da yabancı anahtar kısıtlamalarının devre dışı bırakılması ve etkinleştirilmesi destekleniyor mu? Yoksa tek seçeneğim kısıtlamaları düşürmek ve ardından yeniden oluşturmak` mı?

Çözüm

Veritabanındaki tüm kısıtlamaları devre dışı bırakmak istiyorsanız bu kodu çalıştırmanız yeterlidir:

-- disable all constraints
EXEC sp_MSforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

Bunları tekrar açmak için şunu çalıştırın: (yazdırma elbette isteğe bağlıdır ve sadece tabloları listeler)

-- enable all constraints
exec sp_MSforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

Bir veritabanından diğerine veri doldururken kullanışlı buluyorum. Kısıtlamaları düşürmekten çok daha iyi bir yaklaşımdır. Bahsettiğiniz gibi, veritabanındaki tüm verileri bırakıp yeniden doldururken (örneğin test ortamında) kullanışlı oluyor.

Eğer tüm verileri siliyorsanız bu çözüm size yardımcı olabilir.

Ayrıca bazen tüm tetikleyicileri devre dışı bırakmak da kullanışlıdır, tam çözümü burada görebilirsiniz.

Yorumlar (21)

http://www.sqljunkies.com/WebLog/roman/archive/2005/01/30/7037.aspx

-- Disable all table constraints

ALTER TABLE MyTable NOCHECK CONSTRAINT ALL

-- Enable all table constraints

ALTER TABLE MyTable WITH CHECK CHECK CONSTRAINT ALL

-- Disable single constraint

ALTER TABLE MyTable NOCHECK CONSTRAINT MyConstraint

-- Enable single constraint

ALTER TABLE MyTable WITH CHECK CHECK CONSTRAINT MyConstraint
Yorumlar (8)

SQL-92 standardı, bir constaint'in DEFERRABLE olarak bildirilmesine izin verir, böylece bir işlem kapsamında ertelenebilir (örtük veya açık olarak). Ne yazık ki, SQL Server'da bu SQL-92 işlevi hala eksiktir.

Bana göre, bir kısıtlamayı NOCHECK olarak değiştirmek, veritabanı yapısını anında değiştirmeye benzer - kısıtlamaları düşürmek kesinlikle öyledir - ve kaçınılması gereken bir şeydir (örneğin, kullanıcılar daha fazla ayrıcalık gerektirir).

Yorumlar (0)