如何对 SQL Server 数据库进行版本控制?
Posted
技术标签:
【中文标题】如何对 SQL Server 数据库进行版本控制?【英文标题】:How to version control SQL Server databases? 【发布时间】:2009-03-23 09:41:11 【问题描述】:我有 SQL Server 数据库并在其中进行更改。一些数据库表的记录是我的应用程序运行所需的起始记录。我想对数据库和这些记录(行)进行版本控制。是否可以这样做并将其捆绑到我的源代码的 SVN 版本控制中,或者是否有其他解决方案?我想完成此操作,以便能够返回到以前版本的数据库并比较数据库修订版之间的更改。如果这方面的工具是免费的、开源的或者不是很贵,那就太好了。
我的环境是 Visual C# Express、SQL Server 2008 Express 和 Tortoise SVN。
【问题讨论】:
看到这个问题:***.com/questions/4952/database-version-control 欺骗***.com/questions/173/… ? 一个提示是为这些表设置一个通用的命名模式,以便您使用的任何进程都可以更轻松地识别要处理的进程。我将“_LKP”(查找)添加到所有数据应保留的表的末尾。 【参考方案1】:迟到的答案,但希望对其他读者有用
我可以建议使用名为 ApexSQL Source Control 的 SSMS 插件。通过使用此插件,开发人员可以通过向导直接从 SSMS 轻松地将数据库对象与源代码控制系统映射。它包括对 Git、TFS、Mercurial、Subversion、TFS(包括 Visual Studio Online)和其他源代码控制系统的支持。它还包括对源控制静态数据的支持(因此您也可以对记录进行版本控制)。
下载并安装 ApexSQL Source Control 后,只需右键单击要进行版本控制的数据库,然后导航到 SSMS 中的 ApexSQL Source Control 子菜单。点击“Link database to source control”选项,选择源代码控制系统和数据库开发模式,例如:
之后,您可以排除不想链接到源代码管理的对象。可以按所有者或类型排除特定对象。
下一步会提示您提供源代码控制管理系统的登录信息:
完成后,只需单击“完成”按钮,将显示“操作中心”窗口,提供将提交到存储库的对象(这是默认情况下,如果存储库为空)。
数据库链接到源代码管理后,可以从源代码管理客户端执行的所有操作都将在“对象资源管理器”窗格中可用。其中包括:
在锁定或不锁定版本对象的情况下签出, 查看该对象的历史记录并应用特定的修订, 查看对该对象所做的更改并 使用“链接静态数据”将数据从表放置到源代码管理您可以阅读这篇文章了解更多信息:http://solutioncenter.apexsql.com/sql-source-control-reduce-database-development-time/
【讨论】:
【参考方案2】:我们刚刚开始在我们的一些项目中执行以下操作,并且它似乎工作得很好,用于填充“静态”表。
我们的脚本遵循构建临时表的模式,然后填充我们希望真实表类似于的内容。我们只在此处放置人类可读的值(即,我们不包括 IDENTITY/GUID 列)。脚本的其余部分获取临时表并执行适当的 INSERT/UPDATE/DELETE 语句以使真实表类似于临时表。当我们必须改变这个“静态”数据时,我们只需要更新临时表的数量。这意味着版本之间的 DIFF 可以按预期工作,并且回滚脚本就像从源代码管理中获取以前的版本一样简单。
INSERT/UPDATE/DELETE 只需要写入一次。事实上,我们的脚本稍微复杂一些,并且在实际的 DML 语句之前运行了两组验证。一组验证临时表数据(即,我们不会通过尝试使数据库类似于临时表来违反任何约束)。另一个验证临时表和目标数据库(即外键可用)。
【讨论】:
【参考方案3】:SQL Source Control 2.0 中添加了静态数据支持,目前处于测试阶段。更多关于如何尝试的信息可以在这里找到:
http://www.red-gate.com/messageboard/viewtopic.php?t=12298
【讨论】:
请注意,SQL Source Control v2 现在可提供静态数据支持。【参考方案4】:有一个名为Database Publishing Wizard 的免费微软产品,您可以使用它来编写整个数据库(模式和数据)的脚本。它非常适合拍摄数据库当前状态的快照,并且可以让您随时从头开始重新创建
【讨论】:
【参考方案5】:对于数据库(模式)版本控制,我们使用自定义属性,这些属性会在安装程序运行时添加到数据库中。这些脚本的内容是使用我们的构建脚本生成的。
设置属性的脚本如下所示:
DECLARE @AssemblyDescription sysname
SET @AssemblyDescription = N'DailyBuild_20090322.1'
DECLARE @AssemblyFileVersion sysname
SET @AssemblyFileVersion = N'0.9.3368.58294'
-- The extended properties DatabaseDescription and DatabaseFileVersion contain the
-- AssemblyDescription and AssemblyFileVersion of the build that was used for the
-- database script that creates the database structure.
--
-- The current value of these properties can be displayed with the following query:
-- SELECT * FROM sys.extended_properties
IF EXISTS (SELECT * FROM sys.extended_properties WHERE class_desc = 'DATABASE' AND name = N'DatabaseDescription')
BEGIN
EXEC sys.sp_updateextendedproperty @name = N'DatabaseDescription', @value = @AssemblyDescription
END
ELSE
BEGIN
EXEC sys.sp_addextendedproperty @name = N'DatabaseDescription', @value = @AssemblyDescription
END
IF EXISTS (SELECT * FROM sys.extended_properties WHERE class_desc = 'DATABASE' AND name = N'DatabaseFileVersion')
BEGIN
EXEC sys.sp_updateextendedproperty @name = N'DatabaseFileVersion', @value = @AssemblyFileVersion
END
ELSE
BEGIN
EXEC sys.sp_addextendedproperty @name = N'DatabaseFileVersion', @value = @AssemblyFileVersion
END
GO
【讨论】:
【参考方案6】:您可以获得适用于 SQL Server Express 的 SQL Management Studio 版本。我相信您将能够使用它来生成数据库模式的脚本。我认为这会让您手动创建脚本来插入起始记录。
然后,将所有脚本连同以正确顺序运行各个脚本的主脚本一起放入源代码管理中。
您将能够使用 windiff(Visual Studio SDK 免费)运行差异,或者Beyond Compare 价格低廉,而且是一个很棒的差异/合并/同步工具。
【讨论】:
【参考方案7】:MS Visual Studio Team System for Database Developers 具有轻松为整个架构生成创建脚本的功能。唯一的缺点就是成本!
您考虑过使用 SubSonic 吗?
【讨论】:
【参考方案8】:您应该使用特定于数据库的版本控制。
http://msdn.microsoft.com/en-us/library/ms189050.aspx
当 READ_COMMITTED_SNAPSHOT 或 ALLOW_SNAPSHOT_ISOLATION 数据库 选项为 ON,逻辑副本 (版本)为所有数据维护 中进行的修改 数据库。每次修改一行 通过特定的交易, 数据库引擎存储的实例 先前提交的版本 tempdb 中的行的图像。每个 版本标有事务 交易序号 做出了改变。的版本 修改的行使用链接链接 列表。最新的行值总是 存储在当前数据库中并 链接到存储的版本化行 在临时数据库中。
【讨论】:
【参考方案9】:我为此使用bcp
(批量加载实用程序,标准 SQL Server 安装的一部分,包括 Express 版)。
每个包含数据的表都需要一个控制文件Table.ctl
和一个数据文件Table.csv
(这些是可以使用bcp
从现有数据库生成的文本文件)。作为文本文件,这些可以很容易地进行版本控制。
作为我的生成批次的一部分(有关更多信息,请参阅my answer there),我像这样遍历每个控制文件:
SET BASE_NAME=MyDatabaseName
SET CONNECT_STRING=.\SQLEXPRESS
FOR /R %%i IN (.) DO (
FOR %%j IN ("%%~fi\*.ctl") DO (
ECHO + %%~nj
bcp %BASE_NAME%..%%~nj in "%%~dpsj%%~nj.csv" -T -E -S %CONNECT_STRING% -f "%%~dpsj%%~nj.ctl" >"%TMP%\%%~nj.log"
IF %ERRORLEVEL% GTR 0 (
TYPE "%TMP%\%%~nj.log"
GOTO ERROR_USAGE
)
)
)
此脚本的当前限制是文件名必须是表名,如果表名包含特定特殊字符,则可能无法实现。
【讨论】:
【参考方案10】:这个project 有一个很好的部署和回滚示例
【讨论】:
以上是关于如何对 SQL Server 数据库进行版本控制?的主要内容,如果未能解决你的问题,请参考以下文章
您如何实际使用 Visual Studio Team System 数据库项目来版本 Sql Server