Saya memiliki lingkungan pengujian untuk database yang ingin saya muat ulang dengan data baru pada awal siklus pengujian. Saya tidak tertarik membangun kembali seluruh basis data - cukup dengan "mengatur ulang" data.
Apa cara terbaik untuk menghapus semua data dari semua tabel menggunakan TSQL? Apakah ada prosedur, tampilan, dll. Yang dapat disimpan sistem? Saya tidak ingin secara manual membuat dan memelihara pernyataan tabel truncate untuk setiap tabel - saya lebih suka itu dinamis.
sql-server
tsql
sinar
sumber
sumber
Ketika berhadapan dengan menghapus data dari tabel yang memiliki hubungan kunci asing - yang pada dasarnya merupakan kasus dengan database yang dirancang dengan benar - kita dapat menonaktifkan semua kendala, menghapus semua data dan kemudian mengaktifkan kembali kendala
Lebih lanjut tentang menonaktifkan batasan dan pemicu di sini
jika beberapa tabel memiliki kolom identitas, kami mungkin ingin me-reseednya
Perhatikan bahwa perilaku RESEED berbeda antara tabel baru, dan yang sebelumnya memiliki beberapa data yang disisipkan dari BOL :
Terima kasih kepada Robert karena menunjukkan fakta bahwa penonaktifan kendala tidak memungkinkan untuk menggunakan truncate, kendala harus dijatuhkan, dan kemudian diciptakan kembali
sumber
SET ROWCOUNT 0
di awal skrip Anda karena defaultnya adalah membatasi aksi hingga 500 baris! Anda akan mendapatkan kesalahan yang membuat frustrasi seperti yang saya lakukan karena tidak semua data benar-benar telah dihapus.Inilah raja ayah dari skrip penghapusan database. Ini akan menghapus semua tabel dan memasangnya kembali dengan benar:
Nikmati, tapi hati-hati!
sumber
SET QUOTED_IDENTITY OFF
di badannya ( tautan ). UPDATE: Perbaikannya adalah menambahkan "SET QUOTED_IDENTIFIERS on;" di awal setiap pernyataan yang memunculkan kesalahan ini (sebagaimana disebutkan di sini )Cara paling sederhana untuk melakukan ini adalah dengan
ini akan memberi Anda skrip yang menghapus dan membuat ulang semua tabel Anda tanpa perlu khawatir tentang debugging atau apakah Anda sudah memasukkan semuanya. Meskipun ini melakukan lebih dari sekedar pemotongan, hasilnya sama. Hanya perlu diingat bahwa kunci primer peningkatan-otomatis Anda akan mulai dari 0, tidak seperti tabel terpotong yang akan mengingat nilai terakhir yang diberikan. Anda juga dapat menjalankan ini dari kode jika Anda tidak memiliki akses ke studio Manajemen di lingkungan PreProd atau Produksi Anda.
1.
2.
3.
sumber
Memotong semua tabel hanya akan berfungsi jika Anda tidak memiliki hubungan kunci asing antara tabel Anda, karena SQL Server tidak akan memungkinkan Anda untuk memotong tabel dengan kunci asing.
Alternatif untuk ini adalah dengan menentukan tabel dengan kunci asing dan menghapusnya terlebih dahulu, Anda kemudian dapat memotong tabel tanpa kunci asing sesudahnya.
Lihat http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=65341 dan http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=72957 untuk detail lebih lanjut.
sumber
Opsi alternatif yang ingin saya gunakan dengan MSSQL Server Deveploper atau Enterprise adalah membuat snapshot dari database segera setelah membuat skema kosong. Pada titik itu Anda bisa terus mengembalikan database ke snapshot.
sumber
Jangan lakukan ini! Sungguh, bukan ide yang bagus.
Jika Anda tahu tabel mana yang ingin Anda potong, buat prosedur tersimpan yang memotongnya. Anda dapat memperbaiki urutan untuk menghindari masalah kunci asing.
Jika Anda benar-benar ingin memotong semuanya (sehingga Anda dapat BCP memuatnya misalnya), Anda akan dengan cepat menjatuhkan database dan membuat yang baru dari awal, yang akan memiliki manfaat tambahan yang Anda tahu persis di mana Anda berada.
sumber
Jika Anda ingin menyimpan data dalam tabel tertentu (yaitu tabel pencarian statis) saat menghapus / memotong data dalam tabel lain dalam db yang sama, maka Anda perlu loop dengan pengecualian di dalamnya. Inilah yang saya cari ketika saya menemukan pertanyaan ini.
sp_MSForEachTable tampaknya buggy bagi saya (yaitu perilaku tidak konsisten dengan pernyataan IF) yang mungkin mengapa tidak didokumentasikan oleh MS.
sumber
Bagian tersulit dari memotong semua tabel adalah menghapus dan memasang kembali batasan kunci asing.
Query berikut membuat pernyataan drop & create untuk setiap kendala yang terkait dengan setiap nama tabel di @myTempTable. Jika Anda ingin membuat ini untuk semua tabel, Anda dapat menggunakan skema informasi sederhana untuk mengumpulkan nama-nama tabel ini sebagai gantinya.
Saya kemudian hanya menyalin pernyataan untuk menjalankan - tetapi dengan sedikit usaha dev Anda bisa menggunakan kursor untuk menjalankannya secara dinamis.
sumber
Jauh lebih mudah (dan mungkin bahkan lebih cepat) untuk skrip keluar dari database Anda, lalu lepaskan dan buat dari skrip.
sumber
Buat database "templat" kosong, ambil cadangan penuh. Saat Anda perlu menyegarkan, cukup kembalikan menggunakan WITH REPLACE. Cepat, sederhana, antipeluru. Dan jika beberapa tabel di sini atau di sana memerlukan beberapa data dasar (mis. Informasi konfigurasi, atau hanya informasi dasar yang membuat aplikasi Anda berjalan) itu juga menangani itu.
sumber
Ini adalah salah satu cara untuk melakukannya ... kemungkinan ada 10 lainnya yang lebih baik / lebih efisien, tetapi sepertinya ini dilakukan sangat jarang, jadi begini ...
dapatkan daftar
tables
darisysobjects
, lalu lilitkan dengan kursor, yang memanggilsp_execsql('truncate table ' + @table_name)
masing-masingiteration
.sumber
Jalankan bagian yang dikomentari satu kali, isi tabel _TruncateList dengan tabel yang ingin Anda potong, kemudian jalankan sisa skrip. Tabel _ScriptLog perlu dibersihkan dari waktu ke waktu jika Anda sering melakukan ini.
Anda dapat memodifikasi ini jika Anda ingin melakukan semua tabel, cukup masukkan nama SELECT KE #TruncateList FROM sys.tables. Namun, Anda biasanya tidak ingin melakukan semuanya.
Selain itu, ini akan memengaruhi semua kunci asing di basis data, dan Anda dapat memodifikasinya juga jika terlalu tumpul untuk aplikasi Anda. Ini bukan untuk tujuan saya.
sumber
Saya tidak melihat mengapa menghapus data akan lebih baik daripada skrip untuk menjatuhkan dan membuat kembali setiap tabel.
Itu atau simpan cadangan DB kosong Anda dan kembalikan ke yang lama
sumber
Sebelum memotong tabel, Anda harus menghapus semua kunci asing. Gunakan skrip ini untuk menghasilkan skrip final untuk menjatuhkan dan membuat ulang semua kunci asing dalam database. Harap atur variabel @action ke 'CREATE' atau 'DROP'.
sumber
pilih 'delete from' + TABLE_NAME dari INFORMATION_SCHEMA.TABLES di mana TABLE_TYPE = 'BASE TABLE'
dari mana datangnya hasil
Salin dan tempel pada jendela permintaan dan jalankan perintah
sumber
Agak terlambat tetapi mungkin bisa membantu seseorang. Saya membuat prosedur kadang-kadang kembali yang melakukan hal berikut ini menggunakan T-SQL:
Saya telah mendaftarkannya di blog saya di sini
sumber