DTS Alma / Verme Sihirbazı'nı kullanarak veri alırken FK kısıtlamalarıyla nasıl başa çıkabilirim?


16

Üretim db benim dev db veri kopyalamak için SQL Server alma ve verme Sihirbazı'nı kullanmaya çalışıyorum ama bunu yaptığımda "INSERT deyimi FOREIGN KEY kısıtlamasıyla çakıştı" hatasıyla i çok fazla 40 tablo var FK kısıtlamaları, bir damla kısıtlama / constrat komut dosyası eklemek zorunda kalmadan bununla başa çıkmak için kolay bir yolu var mı?

Düzenleme: Sadece çalıştığım SQL Server'ın Web sürümünde, DTS'nin paketleri kaydetmenize izin vermeyeceğini öğrendim.

Yanıtlar:


28

SQLTeam.com bu çözüm verildi:

kullanın:

 EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

Ardından verilerinizi içe aktarın

EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'

Bu yöntemi kullanarak tüm verileri sorunsuz bir şekilde içe aktarabildim.


1
sp_msforeachtable(ve sp_MSForEachDb) belgesiz ve desteklenmiyor. Kullanmamalı / kullanmamalısınız. Tabloları atlayabilir! @AaronBertrand -> sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/… adresindeki bu gönderiye ve bu bağlantı öğesine bakın - (MS bunu düzeltmeyeceklerini belirten) -> connect.microsoft.com/SQLServer / feedback / details / 264677 /…
Kin Shah

Veri dışa aktarma için FK kısıtlamalarını aşmaya çalışırken beynimi dövdükten sonra saatlerce mükemmel çalıştı.
levininja

Azure SQL V12 üzerinde çalışırken, "Saklı yordam 'sp_msforeachtable' bulunamadı."
Dai

Yine de çalışmıyor: /
Douglas Gaskell

Hayat kurtarıcısın
Can Şahin Bakır

5

Kontrol etmediğim bir sunucudan makinemdeki veritabanının tam bir kopyasını ürettim.

Ben bir schmuck , ama ben yaptım:

  1. DB'yi kaynak denetimindeki komut dosyamdan oluşturdu (ipucu, ipucu!) Komut dosyasına sahip değilseniz, Tasksseçenek aracılığıyla her zaman varolan DB'den oluşturabilirsiniz .

  2. Oluşturma sırasında herhangi bir veri YourDB'ye otomatik olarak eklenmişse , a DELETE FROM YourDB.dbo.tblYourTable.

    • Yabancı anahtarlar varken verileri kesemezsiniz, bu nedenle kullanmanız gerekir DELETE.
  3. Bunu hedef sunucunuzda çalıştırın: USE YourDB; EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all';

  4. Sağ tıklayıp YourDB içinde Object Explorer. Tıklayın Tasks->Import Data...

  5. Sihirbazın ilk birkaç ekranı kendini açıklar.

  6. Açık Select Source Table and ViewsSihirbazın ekranında, kopyalanan istediğiniz her tablonun yanındaki onay kutusunu tıklayın.

  7. Ekrandaki her satır (tablo) için vurgulanması için üzerine tıklayın ve ardından düğmesine tıklayın Edit Mappings.

  8. Her satır (tablo) için / işaretini tıklayın Append rows to the destination tableve Enable identity insert.

    • Tıklarsanız Delete rows in destination tablebir sorunu olmadığı için başarısız olur DELETEkomutu, bir sorunları TRUNCATEnedeniyle hala yabancı tuşları ile çakışan komutu TRUNCATEtabi değildir NOCHECK CONSTRAINTönceki.
  9. Sihirbazın geri kalanını tıklatın ve Tamam'ı tıklatın Finish.

  10. Hataları izleyin ; uyarıları büyük olasılıkla yok saymak uygundur.

    • Hatalar varsa, Reportdüğmesini tıklayın ve raporu görüntüleyin. Deneyin ve bir ne süss Success, Errorve Stopped. Muhtemelen bu raporda bir yere gömülen hatanın temel nedeni ne olursa olsun düzeltmeniz gerekecektir. O zaman, muhtemelen bir DELETE FROM YourDB.dbo.theErrorTable. Şimdi içe aktarma sihirbazındaki geri düğmesini tıklayın ve a Success. Reklam sonsuzluğunu tekrarlayın.
  11. Bunu hedef sunucunuzda çalıştırın: USE YourDB; EXEC sp_msforeachtable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all';

    • Hatalar varsa, ... Bilmiyorum ama düzeltip tekrar deneyin!
  12. Yaşasın! :)

Bu soruyu cevaplayan herkese ve SE ağında buna benzer sorulara bunu anlamama yardımcı olduğu için teşekkür ederim.


Hayat kurtarıcısın
Tom Gullen

1
Ciddi teşekkür ederim, bozuk bir sürücüde bir yedek vardı, DB hiçbir yerde kopyalayamadı (i / o hatası). Verileri bir seferde birkaç tablo içe aktarmak,% 99'unu kurtarmama yardımcı oldu.
Tom Gullen

1
Harikasın! Bana yardımcı olan başka bir komut: EXEC sp_msforeachtable 'sil? '; Bir hata oluşursa her şeyi silin yasa. sp_msforeachtable script burada gist.githubusercontent.com/metaskills/893599/raw/…
Sanchitos

4

İçe aktarma sihirbazında önce satırları silebilirsiniz ve kimlik alanlarınız varsa, aşağıdaki gibi kimlik eklemeyi etkinleştirebilirsiniz

resim açıklamasını buraya girin

Kontrol kısıtlamasını devre dışı bırakmak istiyorsanız, sihirbaz paketi kaydetmenizi istediğinde kaydedin ve bağlantı yöneticisini aşağıdaki gibi düzenleyin:

resim açıklamasını buraya girin

Not: Yabancı Anahtarlar tanımlandığında tabloyu TRUNCATE edemezsiniz.


3

Kısıtlamaları düşürmeyin.

Yapmanız gereken, sihirbazın oluşturduğu SSIS paketini kaydetmek ve daha sonra BIDS / SSDT'de düzenlemek. Paketi düzenlediğinizde, üst tabloları işleyebilmeniz ve ardından tüm üst tablolar tamamlandığında alt tabloları işleyebilmeniz için tabloların işlenme sırasını kontrol edebilirsiniz.


3
Bu da gerçekten etkili değil, şu anda her şeyin doğru sırada olduğundan emin olmak için paketi değiştirmek neredeyse bir saat sürecek ve o zaman bile emin olamıyorum. DB büyüdükçe bunu daha hantal hale getirecek ve her seferinde yapacak, hayır, teşekkürler. Bunu yapmanın basit bir yolu olmalı.

1

Bunun gibi sorunlar bize SQL sunucusu yapan kişilerin ürünlerini hiç kullanmadığını gösteriyor. Bu öylesine göze batan bir ihmaldir ki, başka ne basitçe doğru bir şekilde yapmayı unuttuklarını merak etmelidir (diğer DB'lerin yaptığı gibi bu işi yapmak için üstesinden gelmem gereken yaklaşık 30 diğer can sıkıcı meselenin bir listesi var. İlk etapta bunu yapmak için berbat bir sihirbaza ihtiyacımız da dahil olmak üzere [bu sihirbazın aynı DB için aynı tabloları bağlayıp aynı tabloları numaralandırmasını beklerken geçirdiğim zamanım olsaydı geri ... güzel bir tatil için vaktim olur]).

Çok tembelim ve yazmak istemiyorum EXEC sp_msforeachtable ...bunu her yaptığımda iki kere. Etrafımda çalışmam kısıtlamaları üretim sunucusunda bırakmak ve geliştirici sunucusundan kaldırmaktı. Bu hatayı önleyecektir, ancak bu yöntemin birkaç ÇOK BÜYÜK yan etkisi vardır. İlk olarak, artık dev sunucunuza tam bir yedeklemeyi geri yükleyemezsiniz (hepsini tekrar kaldırmayı tamamlamıyorsanız). İkincisi, bu, verilerinizin tüketicilerinin de bu kısıtlamaları uyguladığından (veya bunları umursamadığınızdan) emin olduğunuzda en iyi sonucu verir. Benim durumumda, sadece bir tüketicimiz (web sitemiz) var, bu nedenle bu kısıtlamaları site koduna da ekledik (yani bir kullanıcı kaydını silmeden önce o kullanıcı için tüm telefon kayıtlarını siliyoruz). Evet, Bu aslında ilk etapta kısıtlama ihtiyacını ortadan kaldırır ve yapmam gereken işi iki katına çıkarır, ancak aynı zamanda kodumun DBMS tabanlı kısıtlamalarla veya bu kod olmadan çalıştığını doğrulama şansı verir (aslında hala prod'da olmalarıdır) sunucuyu yalnızca beklenmedik durum planı olarak). Buna tasarımımda bir kusur diyebilirsin, ancak kusurlu bir DBMS için bir geçici çözüm olarak adlandırmayı tercih ederim. Her halükarda, bunu kendi tasarımı ile baş edemediği için MSSQL'den başka bir yerde yapmak daha hızlı ve daha kolaydır.


0

Bence çok önemli bir veri olduğu için üretim sunucusundan yedekleme yapamaz ve geri yükleyemezsiniz. Doğru haklar olmadan gerçekten daha karmaşık hale gelir. Ancak db backup n restore sağ varsa o zaman bunu gerçekleştirebilirsiniz.

Veya başka bir şekilde, ben tavsiye ederim bir yolu tüm kısıtlamaları ve dizinleri bırakmak ve daha sonra veri alındıktan veya verildikten sonra bunları tekrar eklemektir.

Kesin bir cevap değil ama hızlı işleyecek.


Teşekkürler, ama özellikle bir damla / kısıtlama komut dosyası oluşturmak istemiyorum dedi.

0

Sadece bu konuyu okuyun. Bu eski bir yazı ama işte gelecekteki insanların bunu okumasına yardımcı olmak için yaptım.

Benim durumumda boş bir özdeş tabloya aktarmak istedim. Eşlemeyi düzenlerken <ignore>, birincil anahtar için seçiyorum . Tüm içeriğim otomatik olarak güzel bir şekilde ekleniyor.

Umarım birine yardımcı olur


1
Yabancı anahtarlara yardımcı olacak birincil anahtar yoksay?
dezso

Benim durumumda evet aslında bir tablo çoğaltmak beri. Ben de aynı birincil anahtarlarla bitirdim. Bu yüzden masamı işaret eden yabancı anahtarlar hala doğru girişe karşılık geliyor
Greg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.