2009-02-15 42 views
10

Tôi đang làm việc trên ứng dụng AIR sử dụng cơ sở dữ liệu SQLite cục bộ và tự hỏi làm thế nào tôi có thể quản lý cập nhật lược đồ cơ sở dữ liệu khi phân phối phiên bản mới của ứng dụng. Cũng xem xét các bản cập nhật bỏ qua một số phiên bản. Ví dụ. thay vì đi từ 1,0 đến 1,1, tăng từ 1,0 lên 1,5.Cập nhật lược đồ cơ sở dữ liệu

Bạn sẽ giới thiệu kỹ thuật nào?

Trả lời

7

Chúng tôi kịch bản mọi thay đổi DDL để DB và khi chúng ta thực hiện một "giải phóng" chúng ta nối chúng thành một single "nâng cấp" kịch bản, cùng với bất kỳ các Stored Procedure mà đã thay đổi "kể từ lần cuối cùng"

Chúng tôi có một bảng lưu trữ số phiên bản của bản vá mới nhất được áp dụng - vì vậy các công cụ nâng cấp có thể áp dụng mọi bản vá mới hơn.

Mỗi thủ tục được lưu trữ nằm trong một tệp riêng biệt. Mỗi câu lệnh bắt đầu bằng câu lệnh "insert" vào bảng ghi lưu trữ Tên của SProc, Version và "now". (Trên thực tế một SProc được thực hiện để lưu trữ này, nó không phải là một câu lệnh chèn thô). Đôi khi trong quá trình triển khai, chúng tôi thay đổi SProc một cách thủ công hoặc tỷ lệ cược triển khai & kết thúc từ DEV và so sánh nhật ký trên cơ sở dữ liệu TEST và PRODUCTION của khách hàng cho phép chúng tôi kiểm tra xem mọi thứ có cùng phiên bản hay không.

Chúng tôi cũng có cơ sở dữ liệu chính "phát hành", chúng tôi áp dụng bản cập nhật và chúng tôi sử dụng bản sao lưu đã được khôi phục cho bản cài đặt mới (tiết kiệm thời gian chạy tập lệnh, rõ ràng tăng theo thời gian). Chúng tôi cập nhật đó là & khi, bởi vì rõ ràng nếu nó hơi cũ, các tập lệnh vá lỗi sau này có thể được áp dụng.

cơ sở dữ liệu phát hành của chúng tôi cũng có chứa dữ liệu khởi động vệ sinh (trong đó sẽ bị xóa, hoặc đôi khi thông qua & sửa đổi, trước khi cài đặt mới có hiệu lực - vì vậy đây không được bao gồm trong bất kỳ kịch bản cập nhật)

SQL Server có một nút trên thanh công cụ để viết một thay đổi - vì vậy bạn có thể sử dụng các công cụ GUI để thực hiện tất cả các thay đổi, thay vì lưu chúng tạo ra một kịch bản thay thế. (thực tế, có một hộp kiểm để luôn tạo tạo tập lệnh, vì vậy nếu bạn quên và chỉ nhấn SAVE nó vẫn cung cấp cho bạn tập lệnh mà nó được sử dụng sau khi thực tế, có thể được lưu dưới dạng tệp vá)

+0

+1. Tôi làm theo một quy trình tương tự và nó hoạt động tốt. –

+0

+1. Chúng tôi làm theo quy trình tương tự và có một công cụ gọi là SQL Deploy giúp chúng tôi rất nhiều –

1

IMO điều dễ nhất cần làm là xử lý cập nhật từ ví dụ: 1,0 đến 1,5 như là một loạt các bản cập nhật từ 1.0 đến 1.1, 1.1 đến 1.2, v.v. Đối với mỗi thay đổi phiên bản, hãy giữ tập lệnh chuyển đổi/đoạn mã xung quanh.

Sau đó, giữ một bảng có trường phiên bản trong cơ sở dữ liệu và biên dịch vào ứng dụng phiên bản được yêu cầu. Khi khởi động, nếu trường phiên bản không khớp với phiên bản được biên dịch, hãy chạy tất cả các tập lệnh chuyển đổi bắt buộc, từng cái một.

Các tập lệnh chuyển đổi lý tưởng nên bắt đầu một giao dịch và viết phiên bản mới vào cơ sở dữ liệu làm tuyên bố cuối cùng trước khi thực hiện giao dịch.

1

Điều tôi đang xem xét là thêm bảng SchemaVersion vào cơ sở dữ liệu chứa bản ghi cho mọi phiên bản tồn tại. Phiên bản cuối cùng của bảng SchemaVersion là mức hiện tại của cơ sở dữ liệu.

Tôi sẽ tạo (SQL) kịch bản thực hiện các thiết lập ban đầu là 1,0 và sau đó nâng cấp 1,0-1,1, 1,1-1,2 vv

Ngay cả một tươi cài đặt vào ví dụ 1.2 sẽ chạy qua tất cả các tập lệnh này. Điều này có vẻ hơi chậm nhưng chỉ được thực hiện một lần và trên cơ sở dữ liệu trống (gần như).

Ưu điểm lớn của việc này là cài đặt mới sẽ có cùng giản đồ cơ sở dữ liệu như cài đặt được nâng cấp.

Như tôi đã nói: Tôi đang xem xét điều này. Tôi có thể sẽ bắt đầu triển khai vào ngày mai. Nếu bạn quan tâm tôi có thể chia sẻ kinh nghiệm của tôi. Tôi sẽ thực hiện điều này cho một ứng dụng C# có sử dụng LINQ-to-entity với SQL Server và MySQL như DBMSes.

Tôi muốn nghe ý kiến ​​và ý tưởng của bất kỳ ai khác và nếu ai đó có thể chỉ cho tôi một thư viện hoặc lớp học mã nguồn mở thực hiện điều gì đó như thế này, điều đó thật tuyệt vời.

EDIT: Trong câu trả lời cho một khác nhau question here on SO Tôi đã tìm thấy tham chiếu đến Migrator.Net. Tôi bắt đầu sử dụng nó ngày hôm nay và có vẻ như đó chính xác là những gì tôi đang tìm kiếm.

20

Trong trường hợp của SQLite, bạn có thể sử dụng pragma user_version để theo dõi phiên bản của cơ sở dữ liệu. Để có được phiên bản:

PRAGMA user_version 

để thiết lập các phiên bản:

PRAGMA user_version = 5 

sau đó tôi tiếp tục từng nhóm cập nhật trong một tập tin SQL (được nhúng trong ứng dụng) và chạy các bản cập nhật cần thiết để thức dậy lên phiên bản mới nhất:

Select Case currentUserVersion 
Case 1 
    // Upgrade to version 2 
Case 2 
    // Upgrade to version 3 
Case etc... 
End Select 

Điều này cho phép ứng dụng tự cập nhật lên phiên bản mới nhất bất kể phiên bản hiện tại của DB.

0

Tôi gặp sự cố tương tự trong ứng dụng .net mà tôi đang viết.

Cuối cùng tôi đã viết khung nâng cấp của riêng mình để thực hiện công việc (sẽ không hoạt động cho bạn vì nó được viết bằng C#). Bạn có thể muốn xem link text để nhận một số ý tưởng.

Các vấn đề liên quan