Saya mencoba menggunakan SQL Server Import and Export Wizard untuk menyalin data dari db produksi saya ke dev db saya tetapi ketika saya gagal dengan kesalahan "Statemen INSERT bertentangan dengan batasan KUNCI ASING" saya punya lebih dari 40 tabel dengan banyak kendala FK, adakah cara mudah untuk menghadapinya tanpa harus menulis drop constraint / menambahkan skrip constrat?
Sunting: Saya baru tahu bahwa di SQL Server edisi Web, yang saya jalankan, DTS tidak akan membiarkan Anda menyimpan paket.
sp_msforeachtable
(dansp_MSForEachDb
) tidak berdokumen dan tidak didukung. Anda seharusnya tidak / menghindari menggunakannya. Mungkin melewatkan tabel !! Lihat posting ini dari @AaronBertrand -> sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/… dan item hubungkan ini - (MS menunjukkan bahwa mereka tidak akan memperbaikinya) -> connect.microsoft.com/SQLServer / feedback / details / 264677 / ...Saya menghasilkan salinan tepat database di mesin saya dari server yang saya tidak kontrol.
Saya bodoh , tapi inilah yang saya lakukan:
Membuat DB dari skrip saya yang ada di kontrol sumber (petunjuk, petunjuk!) Jika Anda tidak memiliki skrip, Anda selalu dapat membuatnya dari DB yang ada melalui
Tasks
opsi.Jika ada data yang dimasukkan secara otomatis ke dalam YourDB saat pembuatan, jalankan a
DELETE FROM YourDB.dbo.tblYourTable
.DELETE
.Jalankan ini di server tujuan Anda:
USE YourDB; EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all';
Klik kanan pada YourDB di
Object Explorer
. KlikTasks
->Import Data...
Beberapa layar pertama dari wizard cukup jelas.
Pada
Select Source Table and Views
layar wizard, klik kotak centang di sebelah setiap tabel yang ingin Anda salin.Untuk setiap baris (tabel) pada layar itu, klik di atasnya sehingga itu disorot lalu klik
Edit Mappings
.Untuk setiap baris (tabel), klik / centang
Append rows to the destination table
danEnable identity insert
.Delete rows in destination table
akan gagal karena itu tidak mengeluarkanDELETE
perintah, itu mengeluarkanTRUNCATE
perintah yang masih bertentangan dengan kunci asing kami karenaTRUNCATE
tidak diatur olehNOCHECK CONSTRAINT
dari sebelumnya.Klik melalui sisa wizard dan klik
Finish
.Perhatikan kesalahan ; peringatan mungkin ok untuk diabaikan.
Report
tombol dan lihat laporan. Cobalah dan memcahkan apa adalahSuccess
,Error
, danStopped
. Anda mungkin harus memperbaiki apa pun yang menjadi akar penyebab kesalahan yang terkubur dalam laporan itu di suatu tempat. Maka, Anda mungkin perlu melakukanDELETE FROM YourDB.dbo.theErrorTable
. Sekarang klik tombol kembali pada panduan impor dan hapus centang setiap tabel yang aSuccess
. Ulangi tak terhingga iklan.Jalankan ini di server tujuan Anda:
USE YourDB; EXEC sp_msforeachtable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all';
Yay! :)
Terima kasih kepada semua orang yang menjawab pertanyaan ini dan pertanyaan yang serupa dengan ini di jaringan SE untuk membantu saya mencari tahu ini.
sumber
Di panduan impor, Anda dapat menghapus baris terlebih dahulu dan jika Anda memiliki bidang identitas, maka Anda dapat mengaktifkan sisipan identitas seperti di bawah ini
Jika Anda ingin menonaktifkan periksa kendala, maka ketika wisaya meminta Anda untuk menyimpan paket, simpan paket lalu edit koneksi manajer seperti di bawah ini:
Catatan: Anda tidak dapat TRUNCATE tabel ketika ada Kunci Asing yang ditentukan.
sumber
Jangan jatuhkan kendala.
Yang harus Anda lakukan adalah menyimpan paket SSIS yang dibuat oleh wizard, lalu mengeditnya di BIDS / SSDT. Ketika Anda mengedit paket Anda akan dapat mengontrol urutan tabel diproses sehingga Anda dapat memproses tabel induk kemudian memproses tabel anak ketika semua tabel induk selesai.
sumber
Masalah seperti ini menunjukkan kepada kita bahwa orang-orang yang membuat SQL server tidak pernah benar-benar menggunakan produk mereka. Ini adalah kelalaian yang mencolok sehingga orang harus bertanya-tanya apa lagi yang mereka lupa lakukan dengan benar (saya punya daftar sekitar 30 masalah menjengkelkan lainnya seperti ini yang harus saya atasi untuk membuat pekerjaan ini seperti yang dilakukan oleh DB lainnya. kotak, termasuk fakta bahwa kita memerlukan penyihir yang buruk untuk melakukan ini di tempat pertama [jika saya punya waktu saya menghabiskan menunggu penyihir ini untuk menghubungkan dan menghitung tabel yang sama untuk DB yang sama, setiap kali, kembali ... Saya punya waktu untuk liburan yang menyenangkan]).
Saya sangat malas dan tidak mau mengetik
EXEC sp_msforeachtable ...
dua kali setiap kali saya melakukan ini. Pekerjaan saya adalah meninggalkan kendala pada server produksi dan menghapusnya dari server dev. Ini akan mencegah kesalahan tetapi metode ini memiliki beberapa efek samping SANGAT BESAR. Pertama, Anda tidak akan lagi bisa mengembalikan cadangan penuh ke server dev Anda (kecuali Anda tidak perlu menghapus semuanya lagi). Kedua, ini bekerja paling baik ketika Anda yakin bahwa konsumen data Anda juga menegakkan batasan-batasan ini (atau tidak peduli dengan mereka). Dalam kasus saya, kami hanya memiliki satu konsumen (situs web kami) sehingga kami telah membuat batasan ini ke dalam kode situs juga (yaitu sebelum kami menghapus catatan pengguna, kami menghapus semua catatan telepon untuk pengguna itu terlebih dahulu). Iya, ini pada dasarnya meniadakan perlunya kendala di tempat pertama dan menggandakan pekerjaan yang harus saya lakukan tetapi juga memberi saya kesempatan untuk memverifikasi bahwa kode saya bekerja dengan atau tanpa kendala berbasis DBMS (kenyataannya adalah bahwa mereka masih di prod server hanya sebagai rencana kontingensi). Anda bisa menyebutnya cacat dalam desain saya, tetapi saya lebih suka menyebutnya solusi untuk DBMS yang cacat. Bagaimanapun, itu masih lebih cepat dan lebih mudah untuk melakukan ini di tempat lain daripada dari dalam MSSQL karena tidak dapat mengatasi desain itu sendiri.sumber
Saya pikir Anda tidak dapat melakukan backup dan restore dari server produksi karena ini adalah data penting. Yah tanpa hak yang tepat itu benar-benar menjadi lebih rumit. Tetapi jika Anda memiliki cadangan db dan mengembalikan tepat maka Anda dapat melakukannya.
Atau yang lain, Salah satu cara yang saya sarankan adalah untuk menghapus semua kendala dan indeks Anda dan kemudian menambahkannya lagi setelah data telah diimpor atau diekspor.
Bukan jawaban yang pasti tetapi akan diproses dengan cepat.
sumber
Baca saja topik itu. Ini adalah posting lama tetapi di sini adalah apa yang saya lakukan untuk membantu orang-orang di masa depan membaca ini.
Dalam kasus saya, saya ingin mengimpor ke tabel identik yang kosong. Saat mengedit pemetaan, saya memilih
<ignore>
untuk kunci utama. Semua konten saya ditambahkan secara otomatis dengan baik.Semoga ini bisa membantu seseorang
sumber