Saya telah berhasil menggunakan metodologi berikut, diuraikan dalam Kontrol Versi dan Database Anda :
- mempertahankan nomor versi di metadata (saya menggunakan properti yang diperluas basis data)
- setiap perubahan skema dikodekan sebagai skrip yang diperbarui dari versi saat ini ke versi berikutnya
- aplikasi dikirimkan dengan semua skrip untuk ditingkatkan dari versi 0 (penerapan awal) hingga versi saat ini
- Setiap perubahan dilakukan melalui skrip. Termasuk perubahan data 'sistem' seperti kamus dan entri tabel pencarian.
- ketika digunakan, aplikasi memeriksa versi skema di-disk, kemudian menjalankan semua langkah pemutakhiran untuk membawa skema ke versi yang diperlukan saat ini
Saya sering mendengar pendapat 'bagaimana ini berbeda dari hanya menjaga skrip definisi objek di bawah kendali sumber?'. Perbedaannya sangat besar, karena ketika Anda menggunakan versi baru aplikasi Anda, Anda tidak akan hanya membuat database baru. Sering kali aplikasi Anda harus meningkatkan basis data yang ada, termasuk data yang ada . Ini adalah perbedaan penting, langkah-langkah peningkatan Anda perlu memastikan integritas dan konsistensi data yang ada selama peningkatan. Beberapa operasi sepele dalam kode (tambahkan kolom non-nullable dengan nilai default ke skrip definisi objek tabel, selesai), tetapi sebenarnya sangat menyakitkan pada penyebaran aktual (tabel memiliki 1,5 miliar baris, kolom tambah akan habis ruang log jika dilakukan dengan cara 'simpleton').
Bagaimana cara kerjanya dengan percabangan:
- ketika cabang dibuat, itu mengambil versi skema saat ini, katakanlah versi 1.6
- ketika tim mulai bekerja di cabang, itu menambahkan versi baru, 1,7, dan kemudian mulai mengkodekan langkah peningkatan dari 1,6 ke 1,7
- langkah peningkatan akan berubah saat modifikasi dilakukan di cabang. Itu selalu menjalankan skrip yang memutakhirkan dari v 1.6 ke 1.7, tetapi apa tepatnya skrip-skrip itu lakukan, tunduk pada iterasi kode normal dan lapor-masuk di cabang
- cabang selesai pengembangan, ia mempersiapkan integrasi terbalik (untuk digabungkan kembali ke baseline)
- itu melakukan integrasi maju baru dari baseline ke cabang. Jika integrasi tidak membawa perubahan apa pun ke versi skema, semua hal baik, cabang dapat membalikkan integrasi apa adanya. versi 1.7 menjadi versi dasar baru.
- hal yang menarik adalah ketika cabang lain telah membalikkan integrasi ke dalam basis untuk sementara dan sekarang versi skema dasar telah berubah menjadi, katakanlah, 1.7. Dalam hal ini cabang kami harus meningkatkan versi skema target penyebarannya menjadi 1,8 dan melakukan tinjauan terhadap langkah peningkatan yang sebelumnya dari 1,6 menjadi 1,7 untuk melihat bagaimana ia beroperasi di lingkungan baru, meningkatkan dari 1,7 menjadi 1,8. Konflik skema logis harus diselesaikan, skrip mungkin memerlukan perubahan, pengujian harus dilakukan. Setelah selesai, cabang dapat membalikkan integrasi ke basis. Versi target produk yang digunakan sekarang menjadi 1,8.
- ketika cabang lain yang telah bercabang di skema versi 1.6 ingin melakukan integrasi balik, perlu untuk itu harus menabrak versi skema itu ke 1.9, menguji skrip upgrade dari 1.8 ke 1.9, kemudian dapat mengintegrasikan kembali ke pangkalan.
Perhatikan bahwa tidak ada alat yang terlibat, tidak ada skrip skrip ajaib, tidak ada penyihir dan tidak ada skrip klik-tombol-hasil-skrip yang terlibat. Ini adalah proses yang digerakkan oleh pengembang 100%, berdasarkan sumber (skrip). Banyak yang menemukan seluruh proses ini rumit, tetapi berhasil. Faktanya, sebagai pengguna SQL Server, Anda telah meningkatkan hasil dari proses ini dalam penggunaan harian Anda terhadap SQL Server: SQL Server itu sendiri menggunakan proses pemutakhiran basis data yang sangat mirip dan, seperti yang mungkin Anda harapkan, proses pengembangan produk membuat penggunaan ekstensif percabangan dan masalah yang Anda sebutkan adalah masalah yang sangat nyata yang harus diselesaikan.
BTW, bagaimana percabangan / integrasi sebenarnya terjadi berbeda antara produk-produk kontrol sumber, saya menggunakan istilah yang akrab dengan modus operasi mengintegrasikan perforce .