Saya ingin mendapatkan basis data saya di bawah kontrol versi. Adakah yang punya saran atau artikel yang direkomendasikan untuk memulai?
Aku akan selalu ingin memiliki setidaknya beberapa data di sana (sebagai alumb menyebutkan: pengguna jenis dan administrator). Saya juga akan sering menginginkan kumpulan besar data uji yang dihasilkan untuk pengukuran kinerja.
sql-server
database
svn
version-control
Zack Peterson
sumber
sumber
Jawaban:
Martin Fowler menulis artikel favorit saya tentang masalah ini, http://martinfowler.com/articles/evodb.html . Saya memilih untuk tidak menempatkan skema dump di bawah kontrol versi sebagai alumb dan yang lainnya menyarankan karena saya ingin cara mudah untuk meningkatkan basis data produksi saya.
Untuk aplikasi web di mana saya akan memiliki instance database produksi tunggal, saya menggunakan dua teknik:
Skrip Peningkatan Database
Skrip pemutakhiran basis data urutan yang berisi DDL diperlukan untuk memindahkan skema dari versi N ke N + 1. (Ini masuk dalam sistem kontrol versi Anda.) Tabel _version_history_, sesuatu seperti
mendapat entri baru setiap kali skrip upgrade berjalan yang sesuai dengan versi baru.
Ini memastikan bahwa mudah untuk melihat versi skema database apa yang ada dan bahwa skrip peningkatan database hanya dijalankan sekali. Sekali lagi, ini bukan dump database. Sebaliknya, setiap skrip mewakili perubahan yang diperlukan untuk berpindah dari satu versi ke versi berikutnya. Itu adalah skrip yang Anda terapkan ke basis data produksi Anda untuk "meningkatkannya".
Sinkronisasi Pengembang Kotak Pasir
Peringatan: Pengujian otomatis saya dijalankan terhadap database yang benar-benar skema tetapi kosong, jadi saran ini tidak akan sesuai dengan kebutuhan Anda.
sumber
Produk SQL Compare Red Gate tidak hanya memungkinkan Anda melakukan perbandingan tingkat objek, dan menghasilkan skrip perubahan dari itu, tetapi juga memungkinkan Anda untuk mengekspor objek database Anda ke hierarki folder yang diatur oleh jenis objek, dengan satu [objectname] .sql creation skrip per objek di direktori ini. Hirarki tipe objek seperti ini:
\ Fungsi
\ Keamanan
\ Keamanan \ Peran
\ Keamanan \ Skema
\ Keamanan \ Pengguna
\ Prosedur Tersimpan
\ Tabel
Jika Anda membuang skrip Anda ke direktori root yang sama setelah Anda membuat perubahan, Anda dapat menggunakan ini untuk memperbarui repo SVN Anda, dan menyimpan sejarah berjalan dari setiap objek secara individual.
sumber
Ini adalah salah satu "masalah sulit" pembangunan di sekitarnya. Sejauh yang saya tahu tidak ada solusi yang sempurna.
Jika Anda hanya perlu menyimpan struktur basis data dan bukan data, Anda dapat mengekspor basis data sebagai kueri SQL. (di Enterprise Manager: Klik kanan pada basis data -> Hasilkan skrip SQL. Saya merekomendasikan pengaturan "buat satu file per objek" pada tab opsi) Anda kemudian dapat mengkomit file teks ini ke svn dan menggunakan fungsi svn dan logging.
Saya memiliki ini diikat bersama dengan skrip Batch yang mengambil beberapa parameter dan mengatur database. Saya juga menambahkan beberapa pertanyaan tambahan yang memasukkan data default seperti tipe pengguna dan pengguna admin. (Jika Anda ingin info lebih lanjut tentang ini, poskan sesuatu dan saya dapat menempatkan skrip di tempat yang dapat diakses)
Jika Anda perlu menyimpan semua data juga, saya sarankan menyimpan cadangan database dan menggunakan produk Redgate ( http://www.red-gate.com/ ) untuk melakukan perbandingan. Mereka tidak datang murah, tetapi mereka layak setiap sen.
sumber
Pertama, Anda harus memilih sistem kontrol versi yang tepat untuk Anda:
Sistem Kontrol Versi Terpusat - sistem standar tempat pengguna melakukan check-in / check-in sebelum / setelah mereka mengerjakan file, dan file-file tersebut disimpan dalam satu server pusat
Sistem Kontrol Versi Terdistribusi - sistem di mana repositori sedang dikloning, dan masing-masing klon sebenarnya adalah cadangan penuh dari repositori, jadi jika ada server yang crash, maka repositori yang dikloning dapat digunakan untuk mengembalikannya. Setelah memilih sistem yang tepat untuk kebutuhan Anda , Anda harus menyiapkan repositori yang merupakan inti dari setiap sistem kontrol versi. Semua ini dijelaskan dalam artikel berikut: http://solutioncenter.apexsql.com/sql-server-source-control-part-i-understanding -sumber-kontrol-dasar-dasar /
Setelah menyiapkan repositori, dan dalam kasus sistem kontrol versi pusat folder yang berfungsi, Anda dapat membaca artikel ini . Ini menunjukkan cara mengatur kontrol sumber dalam lingkungan pengembangan menggunakan:
SQL Server Management Studio melalui penyedia MSSCCI,
Alat-alat Data Visual Studio dan SQL Server
sumber
Di sini, di Red Gate kami menawarkan alat, Kontrol Sumber SQL , yang menggunakan teknologi SQL Compare untuk menghubungkan database Anda dengan repositori TFS atau SVN. Alat ini diintegrasikan ke dalam SSMS dan memungkinkan Anda bekerja seperti biasa, kecuali sekarang memungkinkan Anda mengkomit objek.
Untuk pendekatan berbasis migrasi (lebih cocok untuk penyebaran otomatis), kami menawarkan SQL Change Automation (sebelumnya bernama ReadyRoll), yang membuat dan mengelola serangkaian skrip tambahan sebagai proyek Visual Studio.
Dalam Kontrol Sumber SQL dimungkinkan untuk menentukan tabel data statis. Ini disimpan dalam kontrol sumber sebagai pernyataan INSERT.
Jika Anda berbicara tentang data uji, kami sarankan Anda untuk menghasilkan data uji dengan alat atau melalui skrip pasca penempatan yang Anda tentukan, atau Anda cukup mengembalikan cadangan produksi ke lingkungan pengembang.
sumber
Anda mungkin ingin melihat Liquibase ( http://www.liquibase.org/ ). Bahkan jika Anda tidak menggunakan alat itu sendiri, ia menangani konsep manajemen perubahan basis data atau refactoring dengan cukup baik.
sumber
+1 untuk semua orang yang merekomendasikan alat RedGate, dengan rekomendasi tambahan dan peringatan.
SqlCompare juga memiliki API yang terdokumentasi dengan baik: jadi Anda dapat, misalnya, menulis aplikasi konsol yang menyinkronkan folder skrip sumber terkontrol dengan database pengujian integrasi CI pada checkin, sehingga ketika seseorang memeriksa perubahan pada skema dari folder skrip mereka secara otomatis digunakan bersama dengan perubahan kode aplikasi yang cocok. Ini membantu menutup celah dengan pengembang yang lupa menyebarkan perubahan dalam db lokal mereka hingga DB pengembangan bersama (sekitar setengah dari kita, saya pikir :)).
Peringatan adalah bahwa dengan solusi skrip atau sebaliknya, alat RedGate cukup lancar sehingga mudah untuk melupakan realitas SQL yang mendasari abstraksi. Jika Anda mengganti nama semua kolom dalam sebuah tabel, SqlCompare tidak memiliki cara untuk memetakan kolom lama ke kolom baru dan akan menjatuhkan semua data dalam tabel. Ini akan menghasilkan peringatan tetapi saya telah melihat orang mengklik lebih dari itu. Ada poin umum di sini yang layak dibuat, saya pikir, bahwa Anda hanya dapat mengotomatiskan versi DB dan memutakhirkan sejauh ini - abstraksinya sangat bocor.
sumber
Kami menggunakan DBGhost untuk mengelola database SQL kami. Kemudian Anda meletakkan skrip Anda untuk membangun database baru di kontrol versi Anda, dan itu akan membangun database baru, atau memutakhirkan database yang ada ke skema di kontrol versi. Dengan begitu Anda tidak perlu khawatir membuat skrip perubahan (walaupun Anda masih bisa melakukannya, jika misalnya Anda ingin mengubah tipe data kolom dan perlu mengonversi data).
sumber
Dengan VS 2010, gunakan proyek Database.
Membuat solusi versi DB yang sempurna, dan menyinkronkan DB dengan mudah.
sumber
Ini adalah pendekatan yang baik untuk menyimpan skrip basis data ke dalam kontrol versi dengan skrip perubahan sehingga Anda dapat memutakhirkan satu basis data yang Anda miliki. Anda juga mungkin ingin menyimpan skema untuk versi yang berbeda sehingga Anda dapat membuat database lengkap tanpa harus menerapkan semua skrip perubahan. Menangani skrip harus otomatis sehingga Anda tidak perlu melakukan pekerjaan manual.
Saya pikir ini penting untuk memiliki database terpisah untuk setiap pengembang dan tidak menggunakan database bersama. Dengan begitu para pengembang dapat membuat uji kasus dan fase pengembangan secara independen dari pengembang lain.
Alat otomatisasi harus memiliki sarana untuk menangani metadata database, yang memberi tahu basis data apa dalam kondisi pengembangan dan tabel mana yang berisi data yang dapat dikontrol versi dan sebagainya.
sumber
Anda juga dapat melihat solusi migrasi. Ini memungkinkan Anda untuk menentukan skema database Anda dalam kode C #, dan memutar versi database Anda naik dan turun menggunakan MSBuild.
Saat ini saya menggunakan DbUp , dan sudah berfungsi dengan baik.
sumber
Anda tidak menyebutkan secara spesifik tentang lingkungan atau kendala target Anda, jadi ini mungkin tidak sepenuhnya berlaku ... tetapi jika Anda sedang mencari cara untuk melacak skema DB yang berkembang secara efektif dan tidak merugikan gagasan untuk menggunakan Ruby, migrasi ActiveRecord ada di depan Anda.
Migrasi secara sistematis menentukan transformasi basis data menggunakan Ruby DSL; setiap transformasi dapat diterapkan atau (biasanya) dibatalkan, memungkinkan Anda untuk beralih ke versi berbeda dari skema DB Anda pada suatu titik waktu tertentu. File yang mendefinisikan transformasi ini dapat diperiksa ke dalam kontrol versi seperti bagian lain dari kode sumber.
Karena migrasi merupakan bagian dari ActiveRecord , mereka biasanya digunakan di aplikasi Rails bertumpuk penuh; namun, Anda dapat menggunakan ActiveRecord independen dari Rails dengan upaya minimal. Lihat di sini untuk perawatan yang lebih terperinci dalam menggunakan migrasi AR di luar Rails.
sumber
Setiap basis data harus di bawah kendali kode sumber. Apa yang kurang adalah alat untuk secara otomatis skrip semua objek database - dan "data konfigurasi" - ke file, yang kemudian dapat ditambahkan ke sistem kontrol sumber apa pun. Jika Anda menggunakan SQL Server, maka solusi saya ada di sini: http://dbsourcetools.codeplex.com/ . Selamat bersenang-senang. - Nathan.
sumber
Itu mudah.
Ketika proyek dasar siap maka Anda harus membuat skrip basis data lengkap. Skrip ini berkomitmen untuk SVN. Ini adalah versi pertama.
Setelah itu semua pengembang membuat skrip perubahan (ALTER ..., tabel baru, sprocs, dll).
Ketika Anda membutuhkan versi saat ini maka Anda harus menjalankan semua skrip perubahan baru.
Ketika aplikasi dirilis ke produksi maka Anda kembali ke 1 (tapi tentu saja itu akan menjadi versi yang berurutan).
Nant akan membantu Anda menjalankan skrip perubahan itu. :)
Dan ingatlah. Semuanya bekerja dengan baik ketika ada disiplin. Setiap kali ketika perubahan database dilakukan maka fungsi yang sesuai dalam kode juga dilakukan.
sumber
Untuk membuat dump ke sistem kontrol kode sumber yang sedikit lebih cepat, Anda dapat melihat objek mana yang telah berubah sejak terakhir kali dengan menggunakan informasi versi di sysobjects.
Pengaturan: Buat tabel di setiap basis data yang ingin Anda periksa secara bertahap untuk menyimpan informasi versi sejak terakhir kali Anda memeriksanya (kosong saat dijalankan pertama kali). Kosongkan tabel ini jika Anda ingin memindai ulang seluruh struktur data Anda.
Mode menjalankan normal: Anda dapat mengambil hasil dari sql ini, dan menghasilkan skrip sql hanya untuk yang Anda minati, dan menempatkannya ke dalam kontrol sumber pilihan Anda.
Catatan: Jika Anda menggunakan pemeriksaan non-standar di salah satu basis data Anda, Anda harus mengganti
/* COLLATE */
dengan pemeriksaan basis data Anda. yaituCOLLATE Latin1_General_CI_AI
sumber
Karena aplikasi kami harus bekerja di beberapa RDBMS, kami menyimpan definisi skema kami dalam kontrol versi menggunakan format Torsi yang netral basis data (XML). Kami juga mengontrol versi data referensi untuk database kami dalam format XML sebagai berikut (di mana "Hubungan" adalah salah satu tabel referensi):
Kami kemudian menggunakan alat buatan sendiri untuk membuat skema peningkatan dan referensi skrip pemutakhiran data yang diperlukan untuk beralih dari versi X dari basis data ke versi X + 1.
sumber
Jika Anda memiliki database kecil dan Anda ingin memvariasikan semuanya, skrip kumpulan ini mungkin membantu. Ini melepaskan, memampatkan, dan memeriksa file MDF database MSSQL ke Subversion.
Jika Anda sebagian besar ingin versi skema Anda dan hanya memiliki sedikit data referensi, Anda mungkin dapat menggunakan Migrasi SubSonic untuk mengatasinya. Keuntungannya adalah Anda dapat dengan mudah bermigrasi ke atas atau ke bawah ke versi tertentu.
sumber
Kami tidak menyimpan skema database, kami menyimpan perubahan ke database. Apa yang kami lakukan adalah menyimpan perubahan skema sehingga kami membuat skrip perubahan untuk versi database apa pun dan menerapkannya pada basis data pelanggan kami. Saya menulis aplikasi utilitas basis data yang didistribusikan dengan aplikasi utama kami yang dapat membaca skrip itu dan mengetahui pembaruan mana yang perlu diterapkan. Ini juga memiliki kecerdasan yang cukup untuk menyegarkan tampilan dan prosedur yang tersimpan sesuai kebutuhan.
sumber
Kami perlu versi SQL database kami setelah kami bermigrasi ke platform x64 dan versi lama kami putus dengan migrasi. Kami menulis aplikasi C # yang menggunakan SQLDMO untuk memetakan semua objek SQL ke folder:
Aplikasi kemudian akan membandingkan versi yang baru ditulis dengan versi yang disimpan di SVN dan jika ada perbedaan itu akan memperbarui SVN. Kami memutuskan bahwa menjalankan proses sekali malam sudah cukup karena kami tidak membuat banyak perubahan pada SQL. Ini memungkinkan kita untuk melacak perubahan pada semua objek yang kita pedulikan dan memungkinkan kita untuk membangun kembali skema penuh kita jika terjadi masalah serius.
sumber
Saya menulis aplikasi ini beberapa waktu lalu, http://sqlschemasourcectrl.codeplex.com/ yang akan memindai MSFT SQL db Anda sesering yang Anda inginkan dan secara otomatis membuang objek Anda (tabel, tampilan, procs, fungsi, pengaturan sql) ke SVN. Bekerja seperti pesona. Saya menggunakannya dengan Unfuddle (yang memungkinkan saya mendapatkan peringatan tentang checkin)
sumber
Solusi khasnya adalah membuang database yang diperlukan dan membuat cadangan file-file itu.
Bergantung pada platform pengembangan Anda, mungkin ada plugin opensource yang tersedia. Menggulirkan kode Anda sendiri untuk melakukannya biasanya cukup sepele.
Catatan: Anda mungkin ingin membuat cadangan dump basis data alih-alih meletakkannya di kontrol versi. File-file tersebut dapat menjadi sangat cepat dalam kontrol versi, dan menyebabkan seluruh sistem kontrol sumber Anda menjadi lambat (saya mengingat kisah horor CVS saat ini).
sumber
Kami baru saja mulai menggunakan Team Foundation Server. Jika basis data Anda berukuran sedang, maka studio visual memiliki beberapa integrasi proyek yang bagus dengan pembandingan bawaan, perbandingan data, alat refactoring basis data, kerangka kerja pengujian basis data, dan bahkan alat pembuatan data.
Tapi, model itu tidak cocok dengan database yang sangat besar atau pihak ketiga (yang mengenkripsi objek) dengan sangat baik. Jadi, yang kami lakukan adalah menyimpan hanya objek yang kami sesuaikan. Server Visual Studio / Team foundation bekerja sangat baik untuk itu.
Kepala kepala TFS Database. blog
Situs MS TFS
sumber
Saya setuju dengan jawaban ESV dan untuk alasan yang tepat saya memulai proyek kecil beberapa waktu lalu untuk membantu menjaga pembaruan basis data dalam file yang sangat sederhana yang kemudian dapat dikelola dengan kode sumber yang panjang. Ini memungkinkan pembaruan yang mudah untuk pengembang serta UAT dan Produksi. Alat ini berfungsi tetapi Sql Server dan MySql.
Beberapa fitur proyek:
Kode dihosting di kode google. Silakan periksa kode Google untuk informasi lebih lanjut
http://code.google.com/p/databaseversioncontrol/
sumber
Beberapa waktu yang lalu saya menemukan modul VB bas yang menggunakan objek DMO dan VSS untuk mendapatkan seluruh db scripted dan masuk ke VSS. Saya mengubahnya menjadi VB Script dan mempostingnya di sini . Anda dapat dengan mudah mengambil panggilan VSS dan menggunakan hal-hal DMO untuk menghasilkan semua skrip, dan kemudian memanggil SVN dari file batch yang sama yang memanggil VBScript untuk memeriksanya?
Dave J
sumber
Saya juga menggunakan versi dalam basis data yang disimpan melalui basis data properti luas prosedur. Aplikasi saya memiliki skrip untuk setiap langkah versi (mis. Pindah dari 1.1 ke 1.2). Ketika digunakan, itu terlihat pada versi saat ini dan kemudian menjalankan skrip satu per satu hingga mencapai versi aplikasi terakhir. Tidak ada skrip yang memiliki versi 'final' langsung, bahkan menggunakan DB bersih melakukan penyebaran melalui serangkaian langkah peningkatan.
Sekarang yang ingin saya tambahkan adalah bahwa saya telah melihat dua hari yang lalu sebuah presentasi di kampus MS tentang edisi VS DB yang baru dan akan datang. Presentasi difokuskan khusus pada topik ini dan saya terharu. Anda pasti harus memeriksanya, fasilitas baru difokuskan untuk menjaga definisi skema dalam skrip T-SQL (CREATEs), mesin runtime delta untuk membandingkan skema penempatan dengan skema yang ditentukan dan melakukan delta ALTER dan integrasi dengan integrasi kode sumber, hingga dan termasuk integrasi berkelanjutan MSBUILD untuk tetes build otomatis. Drop akan berisi jenis file baru, file .dbschema, yang dapat dibawa ke situs penyebaran dan alat baris perintah dapat melakukan 'delta' yang sebenarnya dan menjalankan penyebaran. Saya memiliki entri blog tentang topik ini dengan tautan ke unduhan VSDE, Anda harus memeriksanya:http://rusanu.com/2009/05/15/version-control-and-your-database/
sumber
Ini pertanyaan yang sangat lama, namun banyak yang mencoba menyelesaikannya bahkan sekarang. Yang harus mereka lakukan adalah melakukan riset tentang Proyek Basis Data Visual Studio. Tanpa ini, pengembangan basis data apa pun terlihat sangat lemah. Dari organisasi kode hingga penerapan hingga versi, ini menyederhanakan segalanya.
sumber
Dalam pengalaman saya, solusinya ada dua:
Anda perlu menangani perubahan pada database pengembangan yang dilakukan oleh banyak pengembang selama pengembangan.
Anda perlu menangani peningkatan basis data di situs pelanggan.
Untuk menangani # 1, Anda akan memerlukan alat basis data / penggabungan yang kuat. Alat terbaik harus dapat melakukan penggabungan otomatis sebanyak mungkin sambil memungkinkan Anda untuk menyelesaikan konflik yang tidak ditangani secara manual.
Alat yang sempurna harus menangani operasi penggabungan dengan menggunakan algoritma penggabungan 3 arah yang memperhitungkan perubahan yang dibuat dalam database THEIRS dan database MINE, relatif terhadap database BASE.
Saya menulis alat komersial yang menyediakan dukungan penggabungan manual untuk database SQLite dan saya saat ini menambahkan dukungan untuk algoritma penggabungan 3-cara untuk SQLite. Lihat di http://www.sqlitecompare.com
Untuk menangani # 2 Anda akan membutuhkan kerangka kerja upgrade di tempat.
Ide dasarnya adalah untuk mengembangkan kerangka kerja pemutakhiran otomatis yang tahu cara memutakhirkan dari skema SQL yang ada ke skema SQL yang lebih baru dan dapat membangun jalur peningkatan untuk setiap instalasi DB yang ada.
Lihat artikel saya tentang masalah ini di http://www.codeproject.com/KB/database/sqlite_upgrade.aspx untuk mendapatkan gambaran umum tentang apa yang saya bicarakan.
Semoga berhasil
Liron Levi
sumber
Lihat DBGhost http://www.innovartis.co.uk/ . Saya telah menggunakan mode otomatis selama 2 tahun sekarang dan ini bekerja dengan sangat baik. Hal ini memungkinkan pembangunan DB kami terjadi seperti Java atau pembangunan C terjadi, kecuali untuk database. Kamu tahu apa maksudku.
sumber
Saya akan menyarankan menggunakan alat perbandingan untuk berimprovisasi sistem kontrol versi untuk database Anda. Alternatif yang baik adalah xSQL Schema Compare dan xSQL Data Compare .
Sekarang, jika tujuan Anda hanya memiliki skema database di bawah kontrol versi, Anda cukup menggunakan xSQL Schema Compare untuk menghasilkan xSQL Snapshots dari skema dan menambahkan file-file ini di kontrol versi Anda. Kemudian, untuk mengembalikan atau memperbarui ke versi tertentu cukup bandingkan versi database saat ini dengan snapshot untuk versi tujuan.
Sayangnya, jika Anda ingin memiliki data di bawah kontrol versi juga, Anda dapat menggunakan xSQL Data Compare untuk menghasilkan skrip perubahan untuk database Anda dan menambahkan file .sql di kontrol versi Anda. Anda kemudian dapat menjalankan skrip ini untuk mengembalikan / memperbarui ke versi apa pun yang Anda inginkan. Ingatlah bahwa untuk fungsi 'kembalikan' Anda perlu membuat skrip perubahan yang ketika dijalankan akan membuat Versi 3 sama dengan Versi 2 dan untuk fungsi 'pembaruan', Anda perlu membuat skrip perubahan yang melakukan sebaliknya.
Terakhir, dengan beberapa keterampilan pemrograman batch dasar Anda dapat mengotomatiskan seluruh proses dengan menggunakan versi baris perintah xSQL Schema Compare dan xSQL Data Compare
Penafian: Saya berafiliasi dengan xSQL.
sumber