Phiên bản cơ sở dữ liệu SQL Server


315

Tôi muốn có được cơ sở dữ liệu của tôi dưới sự kiểm soát phiên bản. Có ai có bất kỳ lời khuyên hoặc bài viết đề nghị để tôi bắt đầu?

Tôi sẽ luôn luôn muốn có ít nhất một số dữ liệu trong đó (như alumb đề cập: Các loại người dùng và quản trị viên). Tôi cũng thường muốn có một bộ sưu tập lớn dữ liệu thử nghiệm được tạo để đo hiệu suất.


Cũng có một cái nhìn vào tờ giấy trắng này; Hướng dẫn dứt khoát về kiểm soát phiên bản cơ sở dữ liệu www3.dbmaestro.com/ trên
DBAstep

Câu trả lời:


179

Martin Fowler đã viết bài viết yêu thích của tôi về chủ đề này, http://martinfowler.com/articles/evodb.html . Tôi chọn không đặt các lược đồ trong kiểm soát phiên bản dưới dạng alumb và những người khác đề xuất vì tôi muốn một cách dễ dàng để nâng cấp cơ sở dữ liệu sản xuất của mình.

Đối với một ứng dụng web nơi tôi có một cá thể cơ sở dữ liệu sản xuất, tôi sử dụng hai kỹ thuật:

Tập lệnh nâng cấp cơ sở dữ liệu

Một kịch bản nâng cấp cơ sở dữ liệu chuỗi có chứa DDL cần thiết để di chuyển lược đồ từ phiên bản N sang N + 1. (Chúng đi trong hệ thống kiểm soát phiên bản của bạn.) Một bảng _version_history_, đại loại như

create table VersionHistory (
    Version int primary key,
    UpgradeStart datetime not null,
    UpgradeEnd datetime
    );

nhận được một mục mới mỗi khi tập lệnh nâng cấp chạy tương ứng với phiên bản mới.

Điều này đảm bảo rằng thật dễ dàng để xem phiên bản nào của lược đồ cơ sở dữ liệu tồn tại và các tập lệnh nâng cấp cơ sở dữ liệu chỉ được chạy một lần. Một lần nữa, đây không phải là cơ sở dữ liệu. Thay vào đó, mỗi tập lệnh đại diện cho những thay đổi cần thiết để chuyển từ phiên bản này sang phiên bản tiếp theo. Chúng là tập lệnh mà bạn áp dụng cho cơ sở dữ liệu sản xuất của mình để "nâng cấp" nó.

Đồng bộ hóa nhà phát triển Sandbox

  1. Một tập lệnh để sao lưu, vệ sinh và thu nhỏ cơ sở dữ liệu sản xuất. Chạy này sau mỗi lần nâng cấp lên DB sản xuất.
  2. Một tập lệnh để khôi phục (và điều chỉnh, nếu cần) sao lưu trên máy trạm của nhà phát triển. Mỗi nhà phát triển chạy tập lệnh này sau mỗi lần nâng cấp lên DB sản xuất.

Thông báo trước: Các kiểm tra tự động của tôi chạy trên cơ sở dữ liệu trống nhưng chính xác về lược đồ, vì vậy lời khuyên này sẽ không hoàn toàn phù hợp với nhu cầu của bạn.


16
Phiên bản kiểm soát tập lệnh lược đồ đầy đủ rất hữu ích cho mục đích tham khảo. Chẳng hạn, không thể thấy chính xác những gì đã được thay đổi trong một thủ tục được lưu trữ bằng cách xem câu lệnh ALTER PROCEDURE.
Constantin

12
Việc bỏ (và phiên bản) toàn bộ lược đồ DB sau khi chạy các tập lệnh nâng cấp mới là một cách tốt để cung cấp thông tin cho các công cụ khác trong quá trình xây dựng / triển khai của bạn. Ngoài ra, có lược đồ đầy đủ trong một tập lệnh có nghĩa là có thể "quay vòng" một cơ sở dữ liệu mới mà không cần thông qua tất cả các bước di chuyển. Nó cũng làm cho nó có thể khác phiên bản hiện tại so với các phiên bản tích lũy trước đó.
mlibby

2
Có phải bạn đang đặt các kịch bản nâng cấp trong kiểm soát nguồn, nhưng bạn không đặt các kịch bản rollback ở đó?
AK

9
Tôi có thói quen duy trì tập lệnh tạo và thả hoàn toàn, cũng như tập lệnh delta để cập nhật các phiên bản db hiện có được cập nhật. Cả hai đi vào kiểm soát phiên bản. Các tập lệnh delta được đặt tên theo số sửa đổi. Bằng cách đó, thật dễ dàng để tự động vá lỗi db với tập lệnh cập nhật.
nikc.org

1
Câu trả lời của @ nikc.org, cộng với các móc nối sau cam kết tự động hóa.
Silviu-Marian

45

Sản phẩm so sánh SQL của Red Gate không chỉ cho phép bạn thực hiện so sánh cấp đối tượng và tạo tập lệnh thay đổi từ đó mà còn cho phép bạn xuất các đối tượng cơ sở dữ liệu của mình thành một hệ thống phân cấp thư mục được tổ chức theo loại đối tượng, với một [tên đối tượng]. tập lệnh cho mỗi đối tượng trong các thư mục này. Hệ thống phân cấp kiểu đối tượng là như thế này:

\ Chức năng
\ Bảo mật
\ Bảo mật \ Vai trò
\ Bảo mật \ Lược đồ
\ Bảo mật \ Người dùng
\ Thủ tục lưu trữ
\ Bảng

Nếu bạn kết xuất tập lệnh của mình vào cùng thư mục gốc sau khi bạn thực hiện thay đổi, bạn có thể sử dụng tập lệnh này để cập nhật repo SVN của mình và giữ lịch sử chạy của từng đối tượng.


6
Chúng tôi vừa phát hành SQL Source Control, tích hợp hành vi So sánh SQL mà bạn mô tả vào SSMS và liên kết đến SVN và TFS. Tôi đã thêm một câu trả lời riêng cho câu hỏi này mô tả chi tiết hơn những gì nó làm. red-gate.com/products/Query_Source_Control/index.htm
David Atkinson

39

Đây là một trong những "vấn đề khó khăn" xung quanh sự phát triển. Theo tôi biết không có giải pháp hoàn hảo.

Nếu bạn chỉ cần lưu trữ cấu trúc cơ sở dữ liệu chứ không phải dữ liệu bạn có thể xuất cơ sở dữ liệu dưới dạng truy vấn SQL. (trong Trình quản lý doanh nghiệp: Nhấp chuột phải vào cơ sở dữ liệu -> Tạo tập lệnh SQL. Tôi khuyên bạn nên đặt "tạo một tệp cho mỗi đối tượng" trên tab tùy chọn) Sau đó, bạn có thể cam kết các tệp văn bản này với svn và sử dụng các hàm khác biệt và ghi nhật ký của svn.

Tôi có cái này gắn liền với một tập lệnh Batch có một vài tham số và thiết lập cơ sở dữ liệu. Tôi cũng đã thêm một số truy vấn bổ sung nhập dữ liệu mặc định như loại người dùng và người dùng quản trị viên. (Nếu bạn muốn biết thêm thông tin về điều này, hãy đăng một cái gì đó và tôi có thể đặt tập lệnh ở đâu đó có thể truy cập được)

Nếu bạn cũng cần giữ tất cả dữ liệu, tôi khuyên bạn nên sao lưu cơ sở dữ liệu và sử dụng các sản phẩm Redgate ( http://www.red-gate.com/ ) để so sánh. Họ không đến với giá rẻ, nhưng họ đáng giá từng xu.


1
liên quan đến dữ liệu - bạn có thể sử dụng OffScale DataGrove để lưu các phiên bản của toàn bộ DB (bao gồm dữ liệu). Sau này, bạn có thể sử dụng nó để tạo ra hai bản sao ảo của DB có thể so sánh với sản phẩm của cổng đỏ. Nó cũng giúp bạn tiết kiệm nhu cầu tạo dữ liệu thử nghiệm - bạn chỉ có thể lưu các phiên bản của DB để khớp với các trường hợp thử nghiệm khác nhau (một lần nữa, bản sao đầy đủ, ảo của toàn bộ DB)
Recruitman

1
Làm thế nào để bạn tìm ra thứ tự nào để chạy các kịch bản cơ sở dữ liệu nếu bạn sử dụng tùy chọn "một tệp cho mỗi đối tượng"?
Jamie Kitson

@Taichman: DataGrove dường như không hỗ trợ máy chủ SQL và vì thế không liên quan đến câu hỏi.
Neolisk

38

Trước tiên, bạn phải chọn hệ thống kiểm soát phiên bản phù hợp với mình:

  • Hệ thống kiểm soát phiên bản tập trung - một hệ thống tiêu chuẩn nơi người dùng kiểm tra / đăng ký trước / sau khi họ làm việc trên các tệp và các tệp đang được lưu giữ trong một máy chủ trung tâm duy nhất

  • Hệ thống kiểm soát phiên bản phân tán - một hệ thống mà kho lưu trữ đang được sao chép và mỗi bản sao thực sự là bản sao lưu đầy đủ của kho lưu trữ, vì vậy nếu bất kỳ máy chủ nào gặp sự cố, thì bất kỳ kho lưu trữ nhân bản nào cũng có thể được sử dụng để khôi phục nó Sau khi chọn đúng hệ thống cho nhu cầu của bạn , bạn sẽ cần thiết lập kho lưu trữ là cốt lõi của mọi hệ thống kiểm soát phiên bản Tất cả điều này được giải thích trong bài viết sau: http://solutioncenter.apexsql.com/sql-server-source-control-part-i-under Hiểu -ource-control-basic /

Sau khi thiết lập một kho lưu trữ và trong trường hợp hệ thống kiểm soát phiên bản trung tâm là một thư mục hoạt động, bạn có thể đọc bài viết này . Nó cho thấy cách thiết lập kiểm soát nguồn trong môi trường phát triển bằng cách sử dụng:

  • Studio quản lý máy chủ SQL thông qua nhà cung cấp MSSCCI,

  • Visual Studio và SQL Server Data Tools

  • Công cụ kiểm soát nguồn ApexSQL của bên thứ 3

24

Ở đây tại Red Gate, chúng tôi cung cấp một công cụ, Kiểm soát nguồn SQL , sử dụng công nghệ So sánh SQL để liên kết cơ sở dữ liệu của bạn với kho lưu trữ TFS hoặc SVN. Công cụ này tích hợp vào SSMS và cho phép bạn làm việc như bình thường, ngoại trừ giờ đây nó cho phép bạn cam kết các đối tượng.

Đối với cách tiếp cận dựa trên di chuyển (phù hợp hơn cho triển khai tự động), chúng tôi cung cấp Tự động thay đổi SQL (trước đây gọi là ReadyRoll), tạo và quản lý một tập các tập lệnh gia tăng như một dự án Visual Studio.

Trong SQL Source Control, có thể chỉ định các bảng dữ liệu tĩnh. Chúng được lưu trữ trong điều khiển nguồn dưới dạng các câu lệnh INSERT.

Nếu bạn đang nói về dữ liệu thử nghiệm, chúng tôi khuyên bạn nên tạo dữ liệu thử nghiệm bằng công cụ hoặc thông qua tập lệnh sau triển khai mà bạn xác định hoặc bạn chỉ cần khôi phục bản sao lưu sản xuất vào môi trường dev.


Sản phẩm thú vị (một chút lỗ hổng trên thị trường) nhưng deltas được lưu trữ dưới dạng "TẠO ..." làm tôi sợ. Làm thế nào bạn phân nhánh / sáp nhập?
annakata

1
Chúng tôi lưu trữ các định nghĩa đối tượng là CREATE, nhưng nếu bạn 'nhận được mới nhất' hoặc, ví dụ, sử dụng SQL So sánh Pro để tạo các tập lệnh đồng bộ hóa, chúng sẽ được thay đổi thành các lệnh thích hợp, chẳng hạn như ALTER. Để phân nhánh hoặc hợp nhất, bạn chỉ cần sử dụng hệ thống kiểm soát nguồn của mình giống như cách bạn hiện làm.
David Atkinson

Câu trả lời này là một bản sao câu trả lời của Dane được đăng hai năm trước.
WonderWorker

Đó là một câu trả lời khác nhau. SQL So sánh không có cơ sở dữ liệu kiểm soát phiên bản, trong khi Kiểm soát nguồn SQL được thiết kế dành riêng cho điều đó.
David Atkinson

21

Bạn có thể muốn xem Liquibase ( http://www.liquibase.org/ ). Ngay cả khi bạn không sử dụng chính công cụ này, nó vẫn xử lý các khái niệm về quản lý thay đổi cơ sở dữ liệu hoặc tái cấu trúc khá tốt.


Chúng tôi sử dụng Liquibase trong 5 nhóm phân phối trên một chi nhánh để phân phối liên tục và nó hoạt động rất tốt. Chúng tôi có hơn 10 ứng dụng cơ sở dữ liệu được cài đặt trên nhiều môi trường khác nhau. Chúng tôi sử dụng nó để quản lý lược đồ, lập chỉ mục, phân vùng, mã, dữ liệu tra cứu, nhóm và quyền của nhóm. Chúng tôi sử dụng nó cho Oracle, Postgresql và MSSQL.
Peter Henell

Nếu tôi hiểu chính xác dựa trên phần giới thiệu, nó yêu cầu bạn biết một số ngôn ngữ xml độc quyền để khai báo các đối tượng của bạn thay vì SQL? Không phải là một fan hâm mộ.
JDPeckham

19

+1 cho tất cả những người đã đề xuất các công cụ RedGate, với một đề xuất bổ sung và cảnh báo.

SqlCompare cũng có một API đã được chứng minh tài liệu: ví dụ, bạn có thể viết một ứng dụng bảng điều khiển đồng bộ thư mục tập lệnh kiểm soát nguồn của bạn với cơ sở dữ liệu kiểm tra tích hợp CI để kiểm tra, khi ai đó kiểm tra thay đổi lược đồ từ thư mục tập lệnh của họ nó tự động được triển khai cùng với thay đổi mã ứng dụng phù hợp. Điều này giúp thu hẹp khoảng cách với các nhà phát triển, những người hay quên về việc truyền các thay đổi trong db cục bộ của họ lên DB phát triển được chia sẻ (tôi nghĩ khoảng một nửa trong số chúng ta :)).

Một lưu ý là với một giải pháp theo kịch bản hay nói cách khác, các công cụ RedGate đủ mượt mà để dễ dàng quên đi các thực tế SQL nằm dưới sự trừu tượng hóa. Nếu bạn đổi tên tất cả các cột trong một bảng, SqlCompare không có cách nào để ánh xạ các cột cũ sang các cột mới và sẽ bỏ tất cả dữ liệu trong bảng. Nó sẽ tạo ra các cảnh báo nhưng tôi đã thấy mọi người bấm vào đó. Có một điểm chung ở đây đáng để thực hiện, tôi nghĩ rằng, bạn chỉ có thể tự động hóa phiên bản DB và nâng cấp cho đến nay - các tóm tắt rất rò rỉ.


Vì vậy, cần có một hệ thống theo dõi những cột bạn đang thay đổi và ghi nhớ ánh xạ từ tên cột cũ sang tên cột mới.
bạc

Điều đáng ghi nhớ là đối với những thay đổi cơ sở dữ liệu có sự mơ hồ (và do đó cần một yếu tố của "ý định nhà phát triển"), một giải pháp dựa trên di chuyển là giải pháp thích hợp. Redgate hiện có ReadyRoll đáp ứng cách tiếp cận phiên bản này.
David Atkinson

15

Chúng tôi sử dụng DBGhost để quản lý cơ sở dữ liệu SQL của chúng tôi. Sau đó, bạn đặt tập lệnh của mình để xây dựng cơ sở dữ liệu mới trong kiểm soát phiên bản của mình và nó sẽ xây dựng cơ sở dữ liệu mới hoặc nâng cấp bất kỳ cơ sở dữ liệu hiện có nào lên lược đồ trong kiểm soát phiên bản. Bằng cách đó, bạn không phải lo lắng về việc tạo tập lệnh thay đổi (mặc dù bạn vẫn có thể làm điều đó, ví dụ nếu bạn muốn thay đổi kiểu dữ liệu của một cột và cần chuyển đổi dữ liệu).


Tôi đã sử dụng DbGhost được 10 năm và nó không bao giờ làm tôi thất vọng. Sự hỗ trợ mà họ cung cấp là không ai sánh kịp
penderi

15

Với VS 2010, sử dụng dự án Cơ sở dữ liệu.

  1. Script ra cơ sở dữ liệu của bạn
  2. Thay đổi tập lệnh hoặc trực tiếp trên máy chủ db của bạn
  3. Đồng bộ hóa bằng Dữ liệu> So sánh lược đồ

Làm cho một giải pháp phiên bản DB hoàn hảo và làm cho việc đồng bộ hóa DB trở nên dễ dàng.


2
Vâng, nhưng thật không may, bạn phải nhớ "tạo tập lệnh" mỗi lần. Nếu bạn trực tiếp cập nhật cơ sở dữ liệu, bạn sẽ mất khả năng tạo tập lệnh cập nhật cho delta đó. Nếu chỉ các dự án cơ sở dữ liệu sẽ có một số chức năng tích hợp sẵn để tạo phiên bản.
Jez

13

Đó là một cách tiếp cận tốt để lưu tập lệnh cơ sở dữ liệu vào kiểm soát phiên bản với tập lệnh thay đổi để bạn có thể nâng cấp bất kỳ cơ sở dữ liệu nào bạn có. Ngoài ra, bạn có thể muốn lưu các lược đồ cho các phiên bản khác nhau để bạn có thể tạo cơ sở dữ liệu đầy đủ mà không phải áp dụng tất cả các tập lệnh thay đổi. Xử lý các tập lệnh nên được tự động hóa để bạn không phải làm công việc thủ công.

Tôi nghĩ điều quan trọng là phải có một cơ sở dữ liệu riêng cho mọi nhà phát triển và không sử dụng cơ sở dữ liệu dùng chung. Bằng cách đó, các nhà phát triển có thể tạo các trường hợp thử nghiệm và các giai đoạn phát triển độc lập với các nhà phát triển khác.

Công cụ tự động hóa phải có phương tiện để xử lý siêu dữ liệu cơ sở dữ liệu, cho biết cơ sở dữ liệu nào đang ở trạng thái phát triển và bảng nào chứa dữ liệu có thể kiểm soát phiên bản, v.v.


12

Bạn cũng có thể nhìn vào một giải pháp di chuyển. Điều này cho phép bạn chỉ định lược đồ cơ sở dữ liệu của mình theo mã C # và cuộn phiên bản cơ sở dữ liệu của bạn lên và xuống bằng MSBuild.

Tôi hiện đang sử dụng DbUp và nó đang hoạt động tốt.


11

Bạn đã không đề cập đến bất kỳ chi tiết cụ thể nào về môi trường mục tiêu hoặc các ràng buộc của mình, vì vậy điều này có thể không hoàn toàn có thể áp dụng ... nhưng nếu bạn đang tìm cách theo dõi hiệu quả lược đồ DB đang phát triển và không phản đối ý tưởng sử dụng Sự di cư của Ruby, ActiveRecord nằm ngay trên con hẻm của bạn.

Di chuyển xác định một cách lập trình các chuyển đổi cơ sở dữ liệu bằng cách sử dụng Ruby DSL; mỗi phép chuyển đổi có thể được áp dụng hoặc (thường) được khôi phục, cho phép bạn chuyển sang một phiên bản khác của lược đồ DB tại bất kỳ thời điểm nào. Tệp xác định các phép biến đổi này có thể được kiểm tra trong kiểm soát phiên bản như bất kỳ đoạn mã nguồn nào khác.

Vì di chuyển là một phần của ActiveRecord , nên chúng thường được sử dụng trong các ứng dụng Rails đầy đủ; tuy nhiên, bạn có thể sử dụng ActiveRecord độc lập với Rails với nỗ lực tối thiểu. Xem ở đây để biết cách xử lý chi tiết hơn về việc sử dụng di chuyển của AR bên ngoài Rails.


10

Mọi cơ sở dữ liệu phải được kiểm soát mã nguồn. Điều còn thiếu là một công cụ để tự động kịch bản tất cả các đối tượng cơ sở dữ liệu - và "dữ liệu cấu hình" - thành tệp, sau đó có thể được thêm vào bất kỳ hệ thống kiểm soát nguồn nào. Nếu bạn đang sử dụng SQL Server, thì giải pháp của tôi là ở đây: http://dbsourcetools.codeplex.com/ . Chúc vui vẻ. - Nathan.


9

Thật đơn giản.

  1. Khi dự án cơ sở đã sẵn sàng thì bạn phải tạo tập lệnh cơ sở dữ liệu đầy đủ. Kịch bản này được cam kết cho SVN. Đây là phiên bản đầu tiên.

  2. Sau đó, tất cả các nhà phát triển tạo tập lệnh thay đổi (ALTER ..., bảng mới, sprocs, v.v.).

  3. Khi bạn cần phiên bản hiện tại thì bạn nên thực hiện tất cả các tập lệnh thay đổi mới.

  4. Khi ứng dụng được phát hành để sản xuất thì bạn quay lại 1 (nhưng sau đó nó sẽ là phiên bản kế tiếp).

Nant sẽ giúp bạn thực hiện các kịch bản thay đổi. :)

Và nhớ. Mọi thứ hoạt động tốt khi có kỷ luật. Mỗi khi thay đổi cơ sở dữ liệu được cam kết thì các hàm tương ứng trong mã cũng được cam kết.


2
Sau vài năm tôi nói: Sử dụng FluentMigrator (hoặc công cụ tương tự cho nền tảng của bạn).
dariol

8

Nếu bạn có một cơ sở dữ liệu nhỏ và bạn muốn phiên bản toàn bộ, tập lệnh bó này có thể giúp ích. Nó tách, nén và kiểm tra tệp MDF cơ sở dữ liệu MSSQL vào Subversion.

Nếu bạn chủ yếu muốn phiên bản lược đồ của mình và chỉ cần một lượng nhỏ dữ liệu tham chiếu, bạn có thể sử dụng SubSonic Migration để xử lý điều đó. Lợi ích ở đây là bạn có thể dễ dàng di chuyển lên hoặc xuống bất kỳ phiên bản cụ thể nào.


8

Để chuyển kết xuất sang hệ thống kiểm soát mã nguồn nhanh hơn một chút, bạn có thể xem các đối tượng đã thay đổi kể từ lần trước bằng cách sử dụng thông tin phiên bản trong sysobjects.

Thiết lập: Tạo một bảng trong mỗi cơ sở dữ liệu mà bạn muốn kiểm tra tăng dần để giữ thông tin phiên bản từ lần cuối cùng bạn kiểm tra nó (trống trong lần chạy đầu tiên). Xóa bảng này nếu bạn muốn quét lại toàn bộ cấu trúc dữ liệu của mình.

IF ISNULL(OBJECT_ID('last_run_sysversions'), 0) <> 0 DROP TABLE last_run_sysversions
CREATE TABLE last_run_sysversions (
    name varchar(128), 
    id int, base_schema_ver int,
    schema_ver int,
    type char(2)
)

Chế độ chạy bình thường: Bạn có thể lấy kết quả từ sql này và tạo tập lệnh sql cho chỉ những người bạn quan tâm và đưa chúng vào kiểm soát nguồn theo lựa chọn của bạn.

IF ISNULL(OBJECT_ID('tempdb.dbo.#tmp'), 0) <> 0 DROP TABLE #tmp
CREATE TABLE #tmp (
    name varchar(128), 
    id int, base_schema_ver int,
    schema_ver int,
    type char(2)
)

SET NOCOUNT ON

-- Insert the values from the end of the last run into #tmp
INSERT #tmp (name, id, base_schema_ver, schema_ver, type) 
SELECT name, id, base_schema_ver, schema_ver, type FROM last_run_sysversions

DELETE last_run_sysversions
INSERT last_run_sysversions (name, id, base_schema_ver, schema_ver, type)
SELECT name, id, base_schema_ver, schema_ver, type FROM sysobjects

-- This next bit lists all differences to scripts.
SET NOCOUNT OFF

--Renamed.
SELECT 'renamed' AS ChangeType, t.name, o.name AS extra_info, 1 AS Priority
FROM sysobjects o INNER JOIN #tmp t ON o.id = t.id
WHERE o.name <> t.name /*COLLATE*/
AND o.type IN ('TR', 'P' ,'U' ,'V')
UNION 

--Changed (using alter)
SELECT 'changed' AS ChangeType, o.name /*COLLATE*/, 
       'altered' AS extra_info, 2 AS Priority
FROM sysobjects o INNER JOIN #tmp t ON o.id = t.id 
WHERE (
   o.base_schema_ver <> t.base_schema_ver
OR o.schema_ver      <> t.schema_ver
)
AND  o.type IN ('TR', 'P' ,'U' ,'V')
AND  o.name NOT IN ( SELECT oi.name 
         FROM sysobjects oi INNER JOIN #tmp ti ON oi.id = ti.id
         WHERE oi.name <> ti.name /*COLLATE*/
         AND oi.type IN ('TR', 'P' ,'U' ,'V')) 
UNION

--Changed (actually dropped and recreated [but not renamed])
SELECT 'changed' AS ChangeType, t.name, 'dropped' AS extra_info, 2 AS Priority
FROM #tmp t
WHERE    t.name IN ( SELECT ti.name /*COLLATE*/ FROM #tmp ti
         WHERE NOT EXISTS (SELECT * FROM sysobjects oi
                           WHERE oi.id = ti.id))
AND  t.name IN ( SELECT oi.name /*COLLATE*/ FROM sysobjects oi
         WHERE NOT EXISTS (SELECT * FROM #tmp ti
                           WHERE oi.id = ti.id)
         AND   oi.type  IN ('TR', 'P' ,'U' ,'V'))
UNION

--Deleted
SELECT 'deleted' AS ChangeType, t.name, '' AS extra_info, 0 AS Priority
FROM #tmp t
WHERE NOT EXISTS (SELECT * FROM sysobjects o
                  WHERE o.id = t.id)
AND t.name NOT IN (  SELECT oi.name /*COLLATE*/ FROM sysobjects oi
         WHERE NOT EXISTS (SELECT * FROM #tmp ti
                           WHERE oi.id = ti.id)
         AND   oi.type  IN ('TR', 'P' ,'U' ,'V'))
UNION

--Added
SELECT 'added' AS ChangeType, o.name /*COLLATE*/, '' AS extra_info, 4 AS Priority
FROM sysobjects o
WHERE NOT EXISTS (SELECT * FROM #tmp t
                  WHERE o.id = t.id)
AND      o.type  IN ('TR', 'P' ,'U' ,'V')
AND  o.name NOT IN ( SELECT ti.name /*COLLATE*/ FROM #tmp ti
         WHERE NOT EXISTS (SELECT * FROM sysobjects oi
                           WHERE oi.id = ti.id))
ORDER BY Priority ASC

Lưu ý: Nếu bạn sử dụng đối chiếu không chuẩn trong bất kỳ cơ sở dữ liệu nào của mình, bạn sẽ cần thay thế /* COLLATE */bằng đối chiếu cơ sở dữ liệu của mình. I ECOLLATE Latin1_General_CI_AI


8

Vì ứng dụng của chúng tôi phải hoạt động trên nhiều RDBMS, chúng tôi lưu trữ định nghĩa lược đồ của chúng tôi trong kiểm soát phiên bản bằng cách sử dụng định dạng Mô-men xoắn trung tính cơ sở dữ liệu (XML). Chúng tôi cũng kiểm soát phiên bản dữ liệu tham chiếu cho cơ sở dữ liệu của chúng tôi theo định dạng XML như sau (trong đó "Mối quan hệ" là một trong các bảng tham chiếu):

  <Relationship RelationshipID="1" InternalName="Manager"/>
  <Relationship RelationshipID="2" InternalName="Delegate"/>
  etc.

Sau đó, chúng tôi sử dụng các công cụ được trồng tại nhà để tạo các kịch bản nâng cấp lược đồ và nâng cấp dữ liệu tham chiếu được yêu cầu chuyển từ phiên bản X của cơ sở dữ liệu sang phiên bản X + 1.


7

Chúng tôi không lưu trữ lược đồ cơ sở dữ liệu, chúng tôi lưu trữ các thay đổi cho cơ sở dữ liệu. Những gì chúng tôi làm là lưu trữ các thay đổi lược đồ để chúng tôi xây dựng tập lệnh thay đổi cho bất kỳ phiên bản cơ sở dữ liệu nào và áp dụng nó vào cơ sở dữ liệu của khách hàng. Tôi đã viết một ứng dụng tiện ích cơ sở dữ liệu được phân phối với ứng dụng chính của chúng tôi có thể đọc tập lệnh đó và biết những cập nhật nào cần được áp dụng. Nó cũng có đủ thông minh để làm mới lượt xem và các thủ tục được lưu trữ khi cần thiết.


7

Chúng tôi có nhu cầu phiên bản cơ sở dữ liệu SQL của chúng tôi sau khi chúng tôi di chuyển sang nền tảng x64 và phiên bản cũ của chúng tôi đã bị hỏng khi di chuyển. Chúng tôi đã viết một ứng dụng C # sử dụng SQLDMO để ánh xạ tất cả các đối tượng SQL vào một thư mục:

                Nguồn gốc
                    Tên máy chủ
                       Tên cơ sở dữ liệu
                          Đối tượng lược đồ
                             Cơ sở dữ liệu kích hoạt *
                                .ddltrigger.sql
                             Chức năng
                                ..feft.sql
                             Bảo vệ
                                Vai trò
                                   Vai trò ứng dụng
                                      .approle.sql
                                   Vai trò cơ sở dữ liệu
                                      .role.sql
                                Lược đồ *
                                   .schema.sql
                                Người dùng
                                   .user.sql
                             Lưu trữ
                                Danh mục toàn văn *
                                   .fulltext.sql
                             Thủ tục lưu trữ
                                ..proc.sql
                             Từ đồng nghĩa *
                                .synonymous.sql
                             Những cái bàn
                                ..table.sql
                                Những ràng buộc
                                   ... chkconst.sql
                                   ... defconst.sql
                                Chỉ mục
                                   ... chỉ mục
                                Chìa khóa
                                   ... fkey.sql
                                   ... pkey.sql
                                   ... ukey.sql
                                Gây nên
                                   ... kích hoạt
                             Các loại
                                Kiểu dữ liệu do người dùng định nghĩa
                                   ..uddt.sql
                                Bộ sưu tập Lược đồ XML *
                                   ..xmlschema.sql
                             Lượt xem
                                ..view.sql
                                Chỉ mục
                                   ... chỉ mục
                                Gây nên
                                   ... kích hoạt

Sau đó, ứng dụng sẽ so sánh phiên bản mới được viết với phiên bản được lưu trong SVN và nếu có sự khác biệt, nó sẽ cập nhật SVN. Chúng tôi xác định rằng chạy quy trình một lần một đêm là đủ vì chúng tôi không thực hiện nhiều thay đổi đối với SQL. Nó cho phép chúng tôi theo dõi các thay đổi đối với tất cả các đối tượng chúng tôi quan tâm cộng với nó cho phép chúng tôi xây dựng lại lược đồ đầy đủ của chúng tôi trong trường hợp xảy ra sự cố nghiêm trọng.


Oooh, điều này sẽ là tuyệt vời để công khai.
Chris Charabaruk

7

Tôi đã viết ứng dụng này cách đây một thời gian, http://sqlschemasourcectrl.codeplex.com/ sẽ quét MSFT SQL db của bạn bao nhiêu lần bạn muốn và tự động đổ các đối tượng của bạn (bảng, khung nhìn, procs, hàm, cài đặt sql) vào SVN. Hoạt động như một lá bùa. Tôi sử dụng nó với Unfuddle (cho phép tôi nhận thông báo khi đăng ký)


6

Giải pháp điển hình là kết xuất cơ sở dữ liệu khi cần thiết và sao lưu các tệp đó.

Tùy thuộc vào nền tảng phát triển của bạn, có thể có các plugin nguồn mở có sẵn. Cuộn mã của riêng bạn để làm điều đó thường khá tầm thường.

Lưu ý: Bạn có thể muốn sao lưu kết xuất cơ sở dữ liệu thay vì đưa nó vào kiểm soát phiên bản. Các tệp có thể nhận được rất nhanh trong kiểm soát phiên bản và khiến toàn bộ hệ thống kiểm soát nguồn của bạn bị chậm (tôi đang nhớ lại một câu chuyện kinh dị CVS vào lúc này).


6

Chúng tôi mới bắt đầu sử dụng Team Foundation Server. Nếu cơ sở dữ liệu của bạn có kích thước trung bình, thì studio hình ảnh có một số tích hợp dự án đẹp với tích hợp so sánh, so sánh dữ liệu, công cụ tái cấu trúc cơ sở dữ liệu, khung kiểm tra cơ sở dữ liệu và thậm chí các công cụ tạo dữ liệu.

Nhưng, mô hình đó không phù hợp với cơ sở dữ liệu của bên thứ ba hoặc rất lớn (mã hóa đối tượng). Vì vậy, những gì chúng tôi đã làm là chỉ lưu trữ các đối tượng tùy chỉnh của chúng tôi. Visual Studio / Team Foundation server hoạt động rất tốt cho điều đó.

Cơ sở dữ liệu TFS arch arch. Blog

Trang web MS TFS


6

Tôi đồng ý với câu trả lời của ESV và vì lý do chính xác đó, tôi đã bắt đầu một dự án nhỏ một thời gian trước để giúp duy trì cập nhật cơ sở dữ liệu trong một tệp rất đơn giản, sau đó có thể được duy trì một mã nguồn dài. Nó cho phép cập nhật dễ dàng cho các nhà phát triển cũng như UAT và Sản xuất. Công cụ này hoạt động trên nhưng Sql Server và MySql.

Một số tính năng của dự án:

  • Cho phép thay đổi lược đồ
  • Cho phép dân số cây giá trị
  • Cho phép chèn dữ liệu thử nghiệm riêng biệt, ví dụ. UAT
  • Cho phép tùy chọn cho rollback (không tự động)
  • Duy trì hỗ trợ cho máy chủ SQL và Mysql
  • Có khả năng nhập cơ sở dữ liệu hiện tại của bạn vào kiểm soát phiên bản bằng một lệnh đơn giản (chỉ máy chủ sql ... vẫn hoạt động trên mysql)

Mã được lưu trữ trên mã google. Vui lòng kiểm tra mã Google để biết thêm thông tin

http://code.google.com.vn/p/databaseversioncontrol/


5

Cách đây một thời gian, tôi đã tìm thấy một mô-đun cơ sở VB sử dụng các đối tượng DMO và VSS để lấy toàn bộ db được viết tắt và vào VSS. Tôi đã biến nó thành VB Script và đăng nó ở đây . Bạn có thể dễ dàng thực hiện các cuộc gọi VSS và sử dụng công cụ DMO để tạo tất cả các tập lệnh, sau đó gọi SVN từ cùng một tệp bó gọi VBScript để kiểm tra chúng?

Dave J


5

Tôi cũng đang sử dụng một phiên bản trong cơ sở dữ liệu được lưu trữ thông qua họ các thủ tục thuộc tính cơ sở dữ liệu mở rộng. Ứng dụng của tôi có các tập lệnh cho từng bước phiên bản (ví dụ: chuyển từ 1.1 sang 1.2). Khi được triển khai, nó nhìn vào phiên bản hiện tại và sau đó chạy từng đoạn script cho đến khi đến phiên bản ứng dụng cuối cùng. Không có tập lệnh nào có phiên bản 'cuối cùng' thẳng, thậm chí triển khai trên DB sạch sẽ triển khai thông qua một loạt các bước nâng cấp.

Bây giờ điều tôi muốn nói thêm là tôi đã thấy hai ngày trước một bài thuyết trình trong khuôn viên MS về phiên bản VS DB mới và sắp tới. Bài thuyết trình được tập trung đặc biệt vào chủ đề này và tôi đã bị thổi bay ra khỏi nước. Bạn chắc chắn nên kiểm tra xem, các phương tiện mới tập trung vào việc giữ định nghĩa lược đồ trong các tập lệnh T-SQL (CREATE), một công cụ delta thời gian chạy để so sánh lược đồ triển khai với lược đồ đã xác định và thực hiện ALTERs delta và tích hợp với tích hợp mã nguồn, tối đa và bao gồm tích hợp liên tục MSBUILD cho các giọt xây dựng tự động. Việc thả sẽ chứa một loại tệp mới, các tệp .dbschema, có thể được đưa đến trang triển khai và một công cụ dòng lệnh có thể thực hiện 'deltas' thực tế và chạy triển khai. Tôi có một mục blog về chủ đề này với các liên kết đến các bản tải xuống VSDE, bạn nên kiểm tra chúng:http://rusanu.com/2009/05/15/version-control-and-your-database/


5

Đây là một câu hỏi rất cũ, tuy nhiên nhiều người đang cố gắng giải quyết vấn đề này ngay cả bây giờ. Tất cả những gì họ phải làm là nghiên cứu về Dự án cơ sở dữ liệu Visual Studio. Không có điều này, bất kỳ sự phát triển cơ sở dữ liệu nào trông rất yếu. Từ tổ chức mã để triển khai đến phiên bản, nó đơn giản hóa mọi thứ.


3

Theo kinh nghiệm của tôi, giải pháp có hai mặt:

  1. Bạn cần xử lý các thay đổi đối với cơ sở dữ liệu phát triển được thực hiện bởi nhiều nhà phát triển trong quá trình phát triển.

  2. Bạn cần xử lý nâng cấp cơ sở dữ liệu trong các trang web của khách hàng.

Để xử lý số 1, bạn sẽ cần một công cụ khác biệt / hợp nhất cơ sở dữ liệu mạnh. Công cụ tốt nhất sẽ có thể thực hiện hợp nhất tự động càng nhiều càng tốt trong khi cho phép bạn giải quyết các xung đột chưa được xử lý bằng tay.

Công cụ hoàn hảo sẽ xử lý các hoạt động hợp nhất bằng cách sử dụng thuật toán hợp nhất 3 chiều có tính đến các thay đổi được thực hiện trong cơ sở dữ liệu THEIRS và cơ sở dữ liệu MINE, liên quan đến cơ sở dữ liệu BASE.

Tôi đã viết một công cụ thương mại cung cấp hỗ trợ hợp nhất thủ công cho cơ sở dữ liệu SQLite và hiện tôi đang thêm hỗ trợ cho thuật toán hợp nhất 3 chiều cho SQLite. Kiểm tra nó tại http://www.sqlitecompare.com

Để xử lý # 2, bạn sẽ cần một khung nâng cấp.

Ý tưởng cơ bản là phát triển khung nâng cấp tự động, biết cách nâng cấp từ lược đồ SQL hiện có lên lược đồ SQL mới hơn và có thể xây dựng đường dẫn nâng cấp cho mọi cài đặt DB hiện có.

Kiểm tra bài viết của tôi về chủ đề này trong http://www.codeproject.com/KB/database/sqlite_upTHER.aspx để có ý tưởng chung về những gì tôi đang nói.

Chúc may mắn

Liron Levi


3

Kiểm tra DBGhost http://www.innovartis.co.uk/ . Tôi đã sử dụng một cách tự động trong 2 năm nay và nó hoạt động rất tốt. Nó cho phép các bản dựng DB của chúng ta xảy ra giống như việc xây dựng Java hoặc C xảy ra, ngoại trừ cơ sở dữ liệu. Bạn có hiểu ý tôi.


2

Tôi sẽ đề nghị sử dụng các công cụ so sánh để cải thiện hệ thống kiểm soát phiên bản cho cơ sở dữ liệu của bạn. Một lựa chọn tốt khác là xQuery Schema So sánhxQuery Data So sánh .

Bây giờ, nếu mục tiêu của bạn là chỉ có lược đồ của cơ sở dữ liệu dưới sự kiểm soát phiên bản, bạn có thể chỉ cần sử dụng xQuery Schema So sánh để tạo xQuery Snapshots của lược đồ và thêm các tệp này trong kiểm soát phiên bản của bạn. Hơn, để hoàn nguyên hoặc cập nhật lên một phiên bản cụ thể, chỉ cần so sánh phiên bản hiện tại của cơ sở dữ liệu với ảnh chụp nhanh cho phiên bản đích.

Than ôi, nếu bạn cũng muốn có dữ liệu dưới sự kiểm soát phiên bản, bạn có thể sử dụng xQuery Data So sánh để tạo tập lệnh thay đổi cho cơ sở dữ liệu của bạn và thêm các tệp .sql trong kiểm soát phiên bản của bạn. Sau đó, bạn có thể thực thi các tập lệnh này để hoàn nguyên / cập nhật lên bất kỳ phiên bản nào bạn muốn. Hãy nhớ rằng đối với chức năng 'hoàn nguyên', bạn cần tạo các tập lệnh thay đổi mà khi được thực thi sẽ làm cho Phiên bản 3 giống như Phiên bản 2 và đối với chức năng 'cập nhật', bạn cần tạo các tập lệnh thay đổi ngược lại.

Cuối cùng, với một số kỹ năng lập trình hàng loạt cơ bản, bạn có thể tự động hóa toàn bộ quá trình bằng cách sử dụng các phiên bản dòng lệnh của xQuery Schema So sánh và xQuery Data So sánh

Tuyên bố miễn trừ trách nhiệm: Tôi liên kết với xQuery.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.