2011-08-23 22 views
6

Yabancı anahtarları seviyorum, ancak onlarla bir sorun yaşadım. Yabancı anahtarların tablolara kapatılmasını engelleyen bir dönüşüm programım var. Bunu yapmamın nedeni, ana tablodaki tüm kayıtları yeniden güncelleyebilmem, ancak diğer tabloları, her seferinde, BÜYÜK oldukları için her defasında yeniden dönüştürmek zorunda kalmadan, el değmemiş birine bağımlı bırakıyorum.Varolan anahtarı etkinleştir ile Varolan verileri denetle

Ben devre dışı bırakmak ve yabancı anahtarları yeniden etkinleştirmek için aşağıdaki komutları kullanıyorum: MyConstraint

ALTER tablo MyTable NOCHECK CONSTRAıNT'I ben yeniden sonra

ALTER tablo MyTable Slayt CONSTRAıNT'I Ancak

MyConstraint "Yaratılış veya Yeniden Etkinleştirme Varolan Verileri Denetle" sınırını etkinleştirin. Hayır olarak ayarlandığını biliyorum çünkü kısıtlamayı devre dışı bıraktım, ancak bunu yaparak benim sevmediğim veritabanı şemasını değiştirdim . Bunun, kısıtlamayı yeniden etkinleştirdiğini düşündüğüm ve mevcut verileri kontrol edeceğini düşündüm, ama görünüşe göre değil.

Bunu ALTER TABLE komutuyla değiştirmenin bir yolu yok mu? Kısıtlamayı bırakıp yeniden yaratırsam yapabilirim, ama elimde olan her yabancı anahtarı yeniden oluşturmak ve bunu sürdürmek için senaryoyu yazmak üzereyim.

SQL Server 2008 R2 kullanıyorum.

-- Enable the constraint 
ALTER TABLE MyTable 
WITH CHECK CHECK CONSTRAINT MyConstraint 
GO 

Not:

cevap

9

bir sınırlama yeniden etkinleştirmek için tüm yabancı anahtar vales geçerli olduğunu bir çek zorlamak için iki kez CHECK belirtmek gerekir.

YABANCI KEY ve is_not_trusted.These sys.check_constraints ve sys.foreign_keys katalog görünümlerinde görüntülenebilir işaretlenmiştir devre dışı kısıtlamaları KONTROL EDİN. Bu, kısıtlamanın, tüm tablo satırları için sistem tarafından doğrulanan uzunluğunun olmadığı anlamına gelir. Kısıtlamayı yeniden etkinleştirdiğinizde bile , ALTER TABLE İLE KONTROL seçeneğini belirtmediğiniz sürece, mevcut satırlarını tabloya göre yeniden doğrulamaz. WITH CHECK belirtmek, güvenilirliği tekrar olarak işaretler.

Ref .: Guidelines for Disabling Indexes and Constraints

(arama motorları için) açıklamalarda belirtildiği gibi, bu katalog görünümünde sys.foreign_keys.is_not_trusted

tekabül

+0

Teşekkürler, bir hayat kurtarıcısın. –

+1

Kayıt için, başka bir yerde bulma zamanım olduğu için: "sys.foreign_keys.is_not_trusted", SQL Server Management Studio'daki "Yabancı Anahtar İlişkileri" iletişim kutusundaki "Varolan Verileri Yaratma veya Yeniden Etkinleştirme Hakkında Verileri Kontrol Et" e karşılık gelir. – leqid