Tôi đã sử dụng thành công phương pháp sau, được xây dựng trong Kiểm soát phiên bản và Cơ sở dữ liệu của bạn :
- duy trì số phiên bản trong siêu dữ liệu (Tôi sử dụng thuộc tính cơ sở dữ liệu mở rộng)
- mọi thay đổi lược đồ được mã hóa thành tập lệnh cập nhật từ phiên bản hiện tại sang phiên bản tiếp theo
- ứng dụng vận chuyển tất cả các tập lệnh để nâng cấp từ phiên bản 0 (triển khai ban đầu) cho đến phiên bản hiện tại
- Mọi thay đổi được thực hiện thông qua một kịch bản. Bao gồm các thay đổi dữ liệu của 'hệ thống' như từ điển và mục nhập bảng tra cứu.
- Khi được triển khai, ứng dụng sẽ kiểm tra phiên bản lược đồ trên đĩa, sau đó chạy tất cả các bước nâng cấp để đưa lược đồ về phiên bản bắt buộc hiện tại
Tôi thường nghe ý kiến 'làm thế nào khác với việc giữ các tập lệnh định nghĩa đối tượng dưới sự kiểm soát nguồn?'. Sự khác biệt là rất lớn, bởi vì khi bạn triển khai một phiên bản mới của ứng dụng, bạn sẽ không chỉ đơn giản là tạo một cơ sở dữ liệu mới. Hầu hết các lần ứng dụng của bạn sẽ phải nâng cấp cơ sở dữ liệu hiện có, bao gồm cả dữ liệu hiện có . Đây là một sự khác biệt quan trọng, các bước nâng cấp của bạn cần đảm bảo tính toàn vẹn và nhất quán của dữ liệu hiện có trong quá trình nâng cấp. Một số thao tác không quan trọng bằng mã (thêm một cột không thể rỗng với giá trị mặc định vào tập lệnh định nghĩa đối tượng bảng, được thực hiện), nhưng thực tế chúng rất đau khi triển khai thực tế (bảng có 1,5 tỷ hàng, cột thêm sẽ hết của không gian nhật ký nếu được thực hiện theo cách 'đơn giản').
Làm thế nào để điều này làm việc với phân nhánh:
- Khi nhánh được tạo, nó ngắt phiên bản lược đồ hiện tại, giả sử phiên bản 1.6
- khi nhóm bắt đầu làm việc trên chi nhánh, nó thêm phiên bản mới, 1.7 và sau đó nó bắt đầu mã hóa bước nâng cấp từ 1.6 lên 1.7
- bước nâng cấp được thay đổi khi sửa đổi được thực hiện trong nhánh. Nó luôn chạy tập lệnh nâng cấp từ v 1.6 lên 1.7, nhưng chính xác những tập lệnh đó làm gì, phải tuân theo các lần lặp và kiểm tra mã thông thường trong nhánh
- nhánh kết thúc phát triển, nó chuẩn bị cho sự tích hợp ngược (sẽ được sáp nhập trở lại vào đường cơ sở)
- nó thực hiện một sự tích hợp chuyển tiếp mới từ đường cơ sở đến chi nhánh. Nếu tích hợp không mang lại bất kỳ thay đổi nào cho phiên bản lược đồ, tất cả mọi thứ đều tốt, nhánh có thể đảo ngược tích hợp như hiện trạng. phiên bản 1.7 trở thành phiên bản cơ sở mới.
- điều thú vị là khi một nhánh khác đã tích hợp ngược vào cơ sở trong thời gian đó và bây giờ phiên bản lược đồ cơ sở đã thay đổi thành, giả sử, 1.7. Trong trường hợp này, chi nhánh của chúng tôi phải nâng phiên bản lược đồ mục tiêu triển khai lên 1.8 và thực hiện đánh giá bước nâng cấp trước đây từ 1.6 lên 1.7 để xem cách hoạt động trong môi trường mới, nâng cấp từ 1.7 lên 1.8. Xung đột lược đồ logic phải được giải quyết, kịch bản có thể yêu cầu thay đổi, thử nghiệm phải được thực hiện. Sau khi hoàn thành, chi nhánh có thể đảo ngược tích hợp vào cơ sở. Phiên bản mục tiêu được triển khai của sản phẩm hiện trở thành 1.8.
- Khi một nhánh khác đã phân nhánh ở phiên bản lược đồ 1.6 muốn tích hợp ngược lại, thì nó sẽ phải nâng phiên bản lược đồ của nó thành 1.9, kiểm tra tập lệnh nâng cấp từ 1.8 lên 1.9, sau đó nó có thể tích hợp trở lại vào cơ sở.
Lưu ý rằng không có công cụ liên quan, không có kịch bản khác của lược đồ ma thuật, không có trình hướng dẫn và không có tập lệnh nhấp chuột phải vào nút phải. Đây là một quá trình hướng đến nhà phát triển 100%, dựa trên nguồn (tập lệnh). Nhiều người tìm thấy toàn bộ quá trình này công phu, nhưng nó hoạt động. Trên thực tế, với tư cách là người dùng SQL Server, bạn đã tận dụng kết quả của quá trình này trong việc sử dụng SQL Server hàng ngày của mình: SQL Server sử dụng quy trình nâng cấp cơ sở dữ liệu rất giống nhau và, như bạn có thể mong đợi, quá trình phát triển sản phẩm sử dụng rộng rãi phân nhánh và vấn đề bạn đề cập là một vấn đề rất thực tế phải được giải quyết.
BTW, cách phân nhánh / tích hợp thực sự xảy ra khác nhau giữa các sản phẩm kiểm soát nguồn, tôi đang sử dụng các thuật ngữ quen thuộc từ chế độ hoạt động tích hợp bắt buộc .