如何对SQL Server数据库进行版本控制?

时间:2009-01-16 20:27:33

标签: sql-server versioning database-versioning

我需要将版本放到SQL Server 2005数据库中,并且可以从.NET应用程序访问这些版本。我在想的是在数据库上使用名为“version”的扩展属性,当然值将是数据库的版本。然后,我可以使用SQL来实现此目的。我的问题是这听起来像一个好的计划还是有更好的方法将版本添加到SQL Server数据库?

让我们假设我无法使用表来保存元数据。

5 个答案:

答案 0 :(得分:11)

我这样做:

创建架构表:

CREATE TABLE [dbo].[SchemaVersion](
    [Major] [int] NOT NULL,
    [Minor] [int] NOT NULL,
    [Build] [int] NOT NULL,
    [Revision] [int] NOT NULL,
    [Applied] [datetime] NOT NULL,
    [Comment] [text] NULL)

更新架构:

INSERT INTO SchemaVersion(Major, Minor, Build, Revision, Applied, Comment)
VALUES (1, 9, 1, 0, getdate(), 'Add Table to track pay status')

获取数据库架构版本:

SELECT TOP 1 Major, Minor, Build from SchemaVersion
ORDER BY Major DESC, Minor DESC, Build DESC, Revision DESC

改编自我在Coding Horror

上阅读的内容

答案 1 :(得分:6)

我们按照您的描述使用扩展属性,它的效果非常好。

我认为拥有一张桌子有点矫枉过正。如果我想跟踪数据库中的差异,我使用源代码控制并将所有数据库生成脚本保留在其中。

我还使用了一些ER图工具来帮助我跟踪数据库版本的变化。这超出了实际应用范围,但它让我能够快速看到发生了什么变化。

我认为这是CASEStudio,或类似的东西。

答案 2 :(得分:2)

如果我理解你的问题是正确的(区分内部数据库版本,如应用程序内部版本号),你可以使用某种SYSVERSION表来保存带有此信息的单行数据。

更容易查询。

还可以包含多列有用信息,或多行代表升级数据库副本的不同时间。

更新那么,如果您无法使用表来保存元数据,那么某种外部信息(硬盘驱动器上的INFO文件?)或扩展属性将是要走的路。

我仍然喜欢表格的想法,但是:)你总是可以使用安全性,只能通过自定义存储过程get_db_version或其他东西来访问它。

答案 3 :(得分:0)

最好的方法是使用2个过程:一个标头用于控制插入的内容,如果释放良好,则验证页脚是否插入数据。正文将包含您的脚本。

你需要一个封装你的脚本并记录所有信息的包装器:到目前为止,已经应用了脚本编号,applyby,applydate date,release results“failed or succeeded”。

答案 4 :(得分:0)

我正在使用类似于Matt解决方案的专用表。除此之外,数据库更改必须在对架构应用任何更改之前检查当前版本。如果当前版本小于预期,则脚本将终止并发生致命错误。如果当前版本大于预期,则脚本会跳过当前步骤,因为该步骤有时已在过去执行过。

以下是编写数据库更改脚本的示例和约定的完整解决方案:How to Maintain SQL Server Database Schema Version