Ada beberapa diskusi di wiki komunitas SO tentang apakah objek database harus dikontrol versi. Namun, saya belum melihat banyak diskusi tentang praktik terbaik untuk membuat proses otomatisasi build untuk objek database.
Ini telah menjadi poin diskusi yang kontroversial bagi tim saya - terutama karena developer dan DBA sering kali memiliki tujuan, pendekatan, dan kekhawatiran yang berbeda saat mengevaluasi manfaat dan risiko pendekatan otomatisasi untuk penerapan database.
Saya ingin mendengar beberapa ide dari komunitas SO tentang praktik apa yang telah efektif di dunia nyata.
Saya menyadari bahwa agak subjektif praktik mana yang benar-benar terbaik, tetapi menurut saya dialog yang baik tentang pekerjaan apa yang dapat bermanfaat bagi banyak orang.
Berikut adalah beberapa pertanyaan teaser saya tentang area yang menjadi perhatian dalam topik ini. Ini tidak dimaksudkan sebagai daftar yang pasti - melainkan sebagai titik awal bagi orang untuk membantu memahami apa yang saya cari.
- Haruskah lingkungan pengujian dan produksi dibangun dari kendali sumber?
- Haruskah keduanya dibuat menggunakan otomatisasi - atau haruskah produksi dengan cara menyalin objek dari lingkungan pengujian yang stabil dan diselesaikan?
- Bagaimana Anda menangani perbedaan potensial antara lingkungan pengujian dan produksi dalam skrip penerapan?
- Bagaimana Anda menguji bahwa skrip penerapan akan bekerja secara efektif terhadap produksi seperti yang mereka lakukan dalam pengujian?
- Jenis objek apa yang harus dikontrol versi?
- Hanya kode (prosedur, paket, pemicu, java, dll)?
- Indeks?
- Kendala?
- Definisi Tabel?
- Tabel Ubah Skrip? (mis. skrip ALTER)
- Segala sesuatu?
- Jenis objek apa yang tidak boleh dikontrol versi?
- Urutan?
- Hibah?
- Akun Pengguna?
- Bagaimana seharusnya objek database diatur dalam repositori SCM Anda?
- Bagaimana Anda menangani hal-hal satu kali seperti skrip konversi atau skrip ALTER?
- Bagaimana Anda menangani objek yang dihentikan dari database?
- Siapa yang harus bertanggung jawab untuk mempromosikan objek dari pengembangan ke tingkat pengujian?
- Bagaimana Anda mengoordinasikan perubahan dari beberapa pengembang?
- Bagaimana Anda menangani percabangan untuk objek database yang digunakan oleh banyak sistem?
- Pengecualian apa, jika ada, yang dapat dibuat secara wajar untuk proses ini?
- Masalah keamanan?
- Data dengan masalah de-identifikasi?
- Skrip yang tidak dapat sepenuhnya otomatis?
- Bagaimana Anda bisa membuat prosesnya tangguh dan dapat dilaksanakan?
- Untuk kesalahan pengembang?
- Untuk masalah lingkungan yang tidak terduga?
- Untuk pemulihan bencana?
- Bagaimana Anda meyakinkan para pengambil keputusan bahwa manfaat DB-SCM benar-benar membenarkan biayanya?
- Bukti anekdot?
- Riset industri?
- Rekomendasi praktik terbaik industri?
- Banding kepada otoritas yang diakui?
- Analisis Biaya / Manfaat?
- Siapa yang harus "memiliki" objek database dalam model ini?
- Pengembang?
- DBA?
- Analis Data?
- Lebih dari satu?
sumber
Jawaban:
Berikut beberapa jawaban atas pertanyaan Anda:
sumber
Saya memperlakukan SQL sebagai kode sumber bila memungkinkan
Jika saya dapat menulisnya dalam standar SQL yang sesuai maka biasanya masuk dalam file dalam kendali sumber saya. File tersebut akan mendefinisikan sebanyak mungkin seperti SPs, pernyataan CREATE Tabel.
Saya juga menyertakan data dummy untuk pengujian di kontrol sumber:
Dan kemudian saya mengabstraksi semua kueri SQL saya sehingga saya dapat membangun seluruh proyek untuk MySQL, Oracle, MSSQL atau yang lainnya.
Otomatisasi build dan uji menggunakan skrip build ini karena sama pentingnya dengan sumber aplikasi dan menguji semuanya mulai dari integritas hingga pemicu, prosedur, dan logging.
sumber
Kami menggunakan integrasi berkelanjutan melalui TeamCity. Pada setiap check in ke kontrol sumber, database dan semua data pengujian dibangun kembali dari awal, lalu kode, kemudian pengujian unit dijalankan terhadap kode. Jika Anda menggunakan alat pembuat kode seperti CodeSmith, alat itu juga dapat ditempatkan ke dalam proses pembangunan Anda untuk menghasilkan lapisan akses data Anda yang segar dengan setiap bangunan, memastikan bahwa semua lapisan Anda "cocok" dan tidak menghasilkan kesalahan karena parameter SP tidak cocok atau kolom hilang.
Setiap build memiliki koleksi skrip SQL sendiri yang disimpan di direktori $ project \ SQL \ di kontrol sumber, diberi prefiks numerik dan dijalankan secara berurutan. Dengan begitu, kami mempraktikkan prosedur penerapan kami di setiap build.
Bergantung pada tabel pencarian, sebagian besar nilai pencarian kita juga disimpan dalam skrip dan dijalankan untuk memastikan data konfigurasi sesuai dengan yang kita harapkan, misalnya, "reason_codes" atau "country_codes". Dengan cara ini kita dapat membuat perubahan data pencarian di dev, mengujinya, lalu "mempromosikan" melalui QA dan produksi, alih-alih menggunakan alat untuk mengubah nilai pencarian dalam produksi, yang dapat berbahaya untuk waktu kerja.
Kami juga membuat satu set skrip "rollback" yang membatalkan perubahan database kami, jika build ke produksi berjalan kacau. Anda dapat menguji skrip rollback dengan menjalankannya, lalu menjalankan kembali pengujian unit untuk versi build satu di bawah Anda, setelah skrip penerapannya berjalan.
sumber
+1 untuk Liquibase : LiquiBase adalah open source (LGPL), pustaka independen basis data untuk melacak, mengelola, dan menerapkan perubahan basis data. Itu dibangun di atas premis sederhana: Semua perubahan database (struktur dan data) disimpan secara deskriptif berbasis XML dan diperiksa ke dalam kontrol sumber. Poin bagusnya, bahwa perubahan DML disimpan secara semantik, bukan hanya diff, sehingga Anda dapat melacak tujuan perubahan.
Itu dapat dikombinasikan dengan kontrol versi GIT untuk interaksi yang lebih baik. Saya akan mengkonfigurasi lingkungan dev-prod kami untuk mencobanya.
Anda juga dapat menggunakan Maven, sistem build Ant untuk membuat kode produksi dari skrip.
Kekurangannya adalah LiquiBase tidak terintegrasi ke dalam IDE SQL yang tersebar luas dan Anda harus melakukan operasi dasar sendiri.
Selain itu, Anda dapat menggunakan DBUnit untuk pengujian DB - alat ini memungkinkan skrip pembuatan data digunakan untuk menguji env produksi Anda dengan pembersihan setelahnya.
MENURUT OPINI SAYA:
Kami menghadapi semua masalah yang disebutkan dengan perubahan kode, penggabungan, penulisan ulang dalam database produksi penagihan kami. Topik ini sangat bagus untuk menemukan semua hal itu.
sumber
Dengan mengajukan "pertanyaan penggoda", Anda tampaknya lebih tertarik pada diskusi daripada pendapat seseorang tentang jawaban akhir. Milis aktif (> 2500 anggota) agileDatabases telah menjawab banyak pertanyaan ini dan, menurut pengalaman saya, merupakan forum yang canggih dan sipil untuk diskusi semacam ini.
sumber
Saya pada dasarnya setuju dengan setiap jawaban yang diberikan oleh van . Untuk lebih banyak wawasan, baseline saya untuk manajemen database adalah seri K. Scott Allen (harus dibaca, IMHO. Dan sepertinya pendapat Jeff juga).
Create.sql
. Ini dapat mencakup penyisipan data statis (daftar ...).Create.sql
:Create.cmd
. Tujuannya terutama untuk memeriksa prasyarat (alat, variabel lingkungan ...) dan mengirim parameter ke skrip SQL. Itu juga dapat memuat data statis secara massal dari file CSV untuk masalah kinerja.Create.cmd
file.IMHO, pemuatan data dinamis harus membutuhkan langkah lain, tergantung pada lingkungan Anda. Pengembang ingin memuat database mereka dengan pengujian, sampah atau tanpa data sama sekali, sementara di sisi lain, manajer produksi ingin memuat data produksi. Saya akan mempertimbangkan untuk menyimpan data pengujian dalam kontrol sumber juga (untuk memudahkan pengujian unit, misalnya).
Setelah versi pertama database dimasukkan ke dalam produksi, Anda tidak hanya perlu membuat skrip (terutama untuk pengembang), tetapi juga meningkatkan skrip (berdasarkan prinsip yang sama):
Upgrade.sql
file (yang dapat memanggil yang lain) yang memungkinkan peningkatan versi N-1 ke versi N (N adalah versi yang dirilis). Saya menyimpan skrip ini di bawah folder bernamaN-1
.Upgrade.cmd
. Itu dapat mengambil versi saat ini (CV) dari database melalui pernyataan SELECT sederhana, meluncurkanUpgrade.sql
skrip yang disimpan di bawahCV
folder, dan mengulang sampai tidak ada folder yang ditemukan. Dengan cara ini, Anda dapat meningkatkan secara otomatis dari, katakanlah, N-3 ke N.Masalahnya adalah:
Mengenai objek database seperti apa yang ingin Anda miliki di bawah kendali sumber? Ya, saya akan mengatakan sebanyak mungkin, tetapi tidak lebih ;-) Jika Anda ingin membuat pengguna dengan kata sandi, berikan mereka kata sandi default (login / login, praktis untuk tujuan pengujian unit), dan ubah kata sandi menjadi operasi manual . Ini sering terjadi dengan Oracle di mana skema juga pengguna ...
sumber
Kami memiliki proyek Silverlight kami dengan database MSSQL dalam kontrol versi Git. Cara termudah adalah untuk memastikan Anda punya slimmed bawah basis data (konten bijaksana), dan melakukan lengkap sampah dari fe Visual Studio. Kemudian Anda dapat melakukan 'sqlcmd' dari skrip build Anda untuk membuat ulang database pada setiap mesin dev.
Untuk penerapan, hal ini tidak mungkin karena database terlalu besar: itulah alasan utama untuk memilikinya di database sejak awal.
sumber
Saya sangat percaya bahwa DB harus menjadi bagian dari kontrol sumber dan sebagian besar dari proses pembangunan. Jika dalam kontrol sumber maka saya memiliki kode pengaman yang sama saat menulis prosedur tersimpan di SQL seperti yang saya lakukan saat menulis kelas di C #. Saya melakukan ini dengan memasukkan direktori skrip DB di bawah pohon sumber saya. Direktori skrip ini tidak selalu memiliki satu file untuk satu objek dalam database. Itu akan menyebalkan! Saya mengembangkan di db saya hanya seperti yang saya lakukan di proyek kode saya. Kemudian ketika saya siap untuk check-in, saya melakukan perbedaan antara versi terakhir database saya dan yang saat ini saya kerjakan. Saya menggunakan Bandingkan SQL untuk ini dan itu menghasilkan skrip dari semua perubahan. Skrip ini kemudian disimpan ke direktori db_update saya dengan konvensi penamaan khusus 1234_TasksCompletedInThisIteration di mana nomor tersebut adalah nomor berikutnya dalam kumpulan skrip yang sudah ada, dan namanya menjelaskan apa yang sedang dilakukan dalam check in ini. Saya melakukan ini karena sebagai bagian dari proses pembangunan saya, saya mulai dengan database baru yang kemudian dibangun secara terprogram menggunakan skrip di direktori ini. Saya menulis tugas NAnt khusus yang mengulangi setiap skrip yang mengeksekusi isinya pada db kosong. Jelas jika saya membutuhkan beberapa data untuk masuk ke db maka saya juga memiliki skrip penyisipan data. Ini memiliki banyak manfaat juga. Satu, semua barang saya berversi. Kedua, setiap build adalah build baru yang berarti tidak akan ada hal licik yang masuk ke proses pengembangan saya (seperti data kotor yang menyebabkan keanehan dalam sistem). Ketiga, ketika orang baru ditambahkan ke tim pengembang, mereka hanya perlu mendapatkan yang terbaru dan pengembang lokal mereka dibuat untuk mereka dengan cepat. Empat, saya dapat menjalankan kasus uji (saya tidak menyebutnya sebagai "uji unit"!) Pada basis data saya karena status basis data disetel ulang dengan setiap build (artinya saya dapat menguji repositori saya tanpa khawatir menambahkan data uji ke db).
Ini bukan untuk semua orang.
Ini bukan untuk setiap proyek. Saya biasanya mengerjakan proyek lapangan hijau yang memberi saya kemudahan ini!
sumber
Daripada berdebat tentang menara putih, berikut adalah solusi yang telah bekerja dengan sangat baik untuk saya pada masalah dunia nyata.
Membangun database dari awal dapat diringkas seperti mengelola skrip sql.
DBdeploy adalah alat yang akan memeriksa status database saat ini - misalnya skrip apa yang sebelumnya telah dijalankan terhadapnya, skrip apa yang tersedia untuk dijalankan dan oleh karena itu skrip apa yang diperlukan untuk dijalankan.
Ini kemudian akan menyusun semua skrip yang dibutuhkan bersama-sama dan menjalankannya. Kemudian merekam skrip mana yang telah dijalankan.
Ini bukan alat tercantik atau yang paling rumit - tetapi dengan pengelolaan yang cermat, alat ini dapat bekerja dengan sangat baik. Ini open source dan mudah dikembangkan. Setelah menjalankan skrip ditangani dengan baik, menambahkan beberapa komponen tambahan seperti skrip shell yang memeriksa skrip terbaru dan menjalankan dbdeploy terhadap instance tertentu dapat dengan mudah dicapai.
Lihat pengantar yang bagus di sini:
http://code.google.com/p/dbdeploy/wiki/GettingStarted
sumber
Anda mungkin menemukan bahwa Liquibase menangani banyak hal yang Anda cari.
sumber
Setiap pengembang harus memiliki database lokalnya sendiri, dan menggunakan kontrol kode sumber untuk memublikasikan ke tim. Solusi saya ada di sini: http://dbsourcetools.codeplex.com/ Selamat bersenang-senang, - Nathan
sumber