2009-02-11 27 views
13

Là kiến ​​trúc sư, nhà phát triển và tư vấn cơ sở dữ liệu, có nhiều câu hỏi có thể được trả lời. Một, mặc dù tôi đã được yêu cầu gần đây và vẫn không thể trả lời tốt, là ...Phương pháp kiểm soát thay đổi cơ sở dữ liệu tốt nhất

"Một trong những phương pháp hoặc kỹ thuật tốt nhất để giữ cho các thay đổi cơ sở dữ liệu được ghi lại, tổ chức là gì có thể triển khai hiệu quả trong môi trường một nhà phát triển hoặc nhiều nhà phát triển. "

Điều này có thể liên quan đến thủ tục được lưu trữ và tập lệnh đối tượng khác, nhưng đặc biệt là lược đồ - từ tài liệu, đến tập lệnh cập nhật vật lý mới, giới thiệu và sau đó toàn vòng kết nối. Có các ứng dụng để thực hiện điều này, nhưng yêu cầu móc lược đồ và chi phí. Tôi thà muốn biết về các kỹ thuật được sử dụng mà không cần nhiều sự tham gia của bên thứ ba.

Trả lời

4

Cách dễ nhất mà tôi đã thấy điều này được thực hiện mà không cần sự trợ giúp của công cụ bên ngoài là tạo "bản vá lược đồ" nếu bạn muốn. Bản vá lược đồ chỉ là một kịch bản lệnh t-sql đơn giản. Bản vá lược đồ được đưa ra một số phiên bản trong kịch bản và số này được lưu trữ trong một bảng trong cơ sở dữ liệu để nhận các thay đổi.

Mọi thay đổi mới đối với cơ sở dữ liệu liên quan đến việc tạo một bản vá lược đồ mới mà sau đó bạn có thể chạy theo thứ tự, sau đó sẽ phát hiện phiên bản cơ sở dữ liệu nào đang chạy và chạy tất cả các bản vá của lược đồ. Sau đó bảng phiên bản lược đồ được cập nhật với bất kỳ ngày/giờ bản vá nào được thực hiện để lưu trữ cho lần chạy tiếp theo.

Một cuốn sách hay có chi tiết như thế này được gọi là Refactoring Databases.

Nếu bạn muốn sử dụng công cụ bên ngoài, bạn có thể xem dự án Ruby's Migrations hoặc công cụ tương tự trong C# được gọi là Migrator.NET. Các công cụ này hoạt động bằng cách tạo các lớp C#/ruby ​​với phép chuyển tiếp "Chuyển tiếp" và "lùi". Những công cụ này có nhiều tính năng phong phú hơn vì chúng biết cách tiến lên cũng như ngược lại trong các bản vá của lược đồ. Như bạn đã nói tuy nhiên, bạn không quan tâm đến một công cụ bên ngoài, nhưng tôi nghĩ rằng tôi sẽ thêm nó cho người đọc khác dù sao.

4
+1

Tôi thích liên kết này rất nhiều. Nó đã được suy nghĩ và thông tin. Nhiều hơn so với câu trả lời được chấp nhận của tôi. Tuy nhiên, nếu tôi nhớ chính xác, các câu trả lời của Stack Overflow phải là câu trả lời/tóm tắt và cung cấp liên kết; thay vì chỉ một liên kết. Lấy làm tiếc. Nhưng quan trọng hơn, cảm ơn nó là tuyệt vời !! Đọc nó! – SnapJag

1

Trong trường hợp của tôi, tôi có một kịch bản tạo ra mỗi khi tôi thay đổi cơ sở dữ liệu, tôi tên là kịch bản như 00001.sql, n.sql và tôi có một bảng với de số tập lệnh cuối cùng mà tôi đã thực thi. Bạn cũng có thể xem Database Documentation

0

miễn là bạn thêm cột/bảng vào cơ sở dữ liệu của bạn, nó sẽ là một nhiệm vụ dễ dàng bằng cách viết kịch bản những thay đổi này trước trong tệp sql. bạn chỉ cần thực hiện chúng. có thể bạn có một số lệnh để thực hiện chúng.

giải pháp tốt là tạo một tệp cho mỗi bảng để tất cả các thay đổi thuộc bảng này sẽ hiển thị với người đang làm việc trên bảng (giống như làm việc trên lớp). điều tương tự cũng hợp lệ đối với các thủ tục hoặc chế độ xem được lưu trữ.

một nhiệm vụ khó khăn hơn (và do đó có thể là công cụ tốt) là bước lùi lại. miễn là bạn chỉ cần thêm các bảng/cột có thể đây sẽ không phải là một vấn đề lớn. nhưng nếu bạn đã bỏ các cột trên một bản cập nhật, và bây giờ bạn phải hoàn tác cập nhật của bạn, dữ liệu không còn ở đó nữa. bạn sẽ cần lấy dữ liệu này từ bản sao lưu. nhưng hãy nhớ, nếu bạn có nhiều hơn thì một vài bảng này có thể là một nhiệm vụ lớn, và trong trường hợp bình thường, bạn nên hoàn tác cập nhật của mình rất nhanh!

nếu bạn chỉ có thể khôi phục bản sao lưu, sau đó là tiền phạt trong thời điểm này.nhưng, nếu bạn cập nhật vào thứ hai, khách hàng của bạn làm việc cho đến thứ tư và sau đó họ thấy rằng một số dữ liệu bị thiếu (mà bạn vừa bỏ ra khỏi bảng) thì bạn không thể khôi phục cơ sở dữ liệu cũ.

tôi có một phương pháp dựa trên mô hình trong tâm trí của mình (xin lỗi, không được triển khai tại thời điểm này) trong đó các thay đổi lược đồ được "lập mô hình" (ví dụ: trên xml) và trong quá trình cập nhật bộ xử lý (ví dụ: chương trình aC#) tất cả "sql" cần thiết và ví dụ di chuyển dữ liệu đến một "dropDatabase". các dữ liệu có thể cư trú ở đó, và nếu vì một lý do nào đó tôi cần phải khôi phục lại một số dữ liệu bị loại bỏ, tôi chỉ có thể làm điều đó với bộ vi xử lý. tôi nghĩ rằng trong một thời gian (năm) cách tiếp cận này không phải là xấu bởi vì nếu không nhà phát triển không chạm vào bảng "cũ" bởi vì họ không biết nữa nếu bảng hoặc cột là thực sự cần thiết. với cách tiếp cận này, bạn không mạo hiểm quá nhiều nếu bạn bỏ thứ gì đó!

0

Những gì tôi làm là:

  • Tất cả các lệnh DDL cần thiết để tái tạo schema (và các thủ tục lưu trữ và các chỉ số, vv) đang ở trong một kịch bản.
  • Để chắc chắn tập lệnh là OK, nó được kiểm tra theo thời gian (tạo cơ sở dữ liệu, chạy tập lệnh và khôi phục bản sao lưu và kiểm tra cơ sở dữ liệu hoạt động tốt).
  • Để kiểm soát thay đổi, tập lệnh được giữ trong Hệ thống kiểm soát phiên bản (tôi thường sử dụng Subversion).

Bí quyết là rằng, nếu cơ sở dữ liệu không thể được đưa xuống để tái tạo với, chẳng hạn, một cột thêm, tôi có hai thay đổi nào, một TABLE ALTER + một sửa đổi trong kịch bản. Làm việc nhiều hơn một chút nhưng, về lâu dài, nó thắng.

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