65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Subversion (SVN) 进行 SQL Server 数据库版本控制

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.61/5 (18投票s)

2006年10月13日

7分钟阅读

viewsIcon

294479

downloadIcon

4443

此工具 (ScriptDB4Svn) 可让您将 SQL Server 数据库添加到 Subversion (SVN) 源代码管理中。

Files output of the tool

引言

如果您使用源代码管理系统来管理项目的源代码,您可能也想过是否可以对数据库做同样的事情。您当然可以!这是我的方法:ScriptDB4Svn 的作用如其名所示:它将您的数据库脚本化,以便在源代码管理系统中使用。由于我使用 SVN 以及 TortoiseSVN shell 扩展,因此我的项目以 SVN 为目标,但您也可以将其用于其他源代码管理系统。

请注意,该工具依赖于 Microsoft SQL Server 2000 随附的脚本工具,仅当您在安装过程中选择了与 SQL Server 7.0 向后兼容时,该工具才会安装在您的系统上。如果您缺少该工具(scptxfr.exe),可以在 SQL Server 2000 安装 CD 上找到它。

该工具仅在 SQL Server 2000 上进行了测试。我不知道它是否适用于 SQL Server 2005。

ScriptDB4Svn 具体做什么?

该工具将 Microsoft SQL Server 的表、关系、视图、存储过程、用户定义类型、默认值、规则、触发器、函数和数据脚本化为单独的 .sql 文件。然后可以将这些单独的文件添加到您的源代码管理系统中,以供版本控制。该工具还可以用于从生成的脚本自动创建干净的数据库,这对于集成到 NAnt、MSBuild、CC.net 等工具中非常有帮助。

有什么好处?

有很多好处;这些只是我想到的。如果您有任何补充,请告诉我!

  • 您了解其他开发人员的数据库更改,他们也了解您的更改。您的数据库将保持同步。
  • 查看是谁添加了哪个表、列、触发器,或者破坏了您的存储过程。(“SVN Blame”显示了何时由谁添加/更改了什么)
  • 从生成的脚本创建干净的数据库,以便轻松部署到测试和生产环境。
  • 将数据库脚本执行添加到持续集成脚本中。
  • 如果您丢失了数据库中的任何内容,您将拥有多个脚本化的备份,可以轻松恢复。
  • 版本标记:在发布新版本的程序时,请将数据库及其数据的确切版本包含在同一个 SVN Tag / 分支中!

使用 ScriptDB4Svn - 手册

将 ScriptDB4SVN.exe 及其 .config 文件复制到您要脚本化数据库的文件夹中。打开 .config 文件并进行适当的更改。该文件包含注释,会告诉您不同设置的含义。

如果您将在开发团队中使用此工具,我建议您的团队中的每个人都阅读本文。这将为您省去一些麻烦!

如何管理数据库更改

  1. 如果任何项目成员更改了他们数据库版本中的任何内容,他们只需运行脚本工具重新生成脚本,然后将更改提交到 SVN 存储库。
  2. 执行 SVN Update 命令后,任何更新的脚本都会复制到其他团队成员的本地版本。一旦他们再次运行脚本工具,数据库更改就会通过 TortoiseSVN 在 Windows 资源管理器中反映出来。通过查看表的/视图的/其他内容的 TortoiseSVN Diff 视图,可以清楚地看到开发人员所做的确切更改。
  3. 其他团队成员通过执行新脚本或在 SQL Server 中手动进行更改来更新其本地数据库。
  4. 一旦工具生成的脚本与存储库中的脚本相同,数据库就再次同步了!

这种方法的一个矛盾之处在于,其他开发人员所做的更改只有在本地重新生成脚本后才会显示。这样,看起来好像远程数据库的更改在本地被“撤销”了,而实际上远程更改尚未被处理(复制)。开发人员对其本地数据库进行的任何未提交的更改,都会以与远程开发人员未处理的更改在 Windows 资源管理器中显示相同的方式显示。

处理/解决数据差异

处理数据冲突可能很棘手,因为关系会确保数据的关系完整性得到维护。如果多个表中的数据发生了更改,仅仅执行删除语句或插入数据可能会导致错误。在这种情况下,删除这些约束、更新数据,然后再重新创建关系会非常有用。完成后,可以轻松地从关系脚本中重新创建已删除的约束。请按照以下步骤避免麻烦

  1. 将您版本的数据脚本 SVN Revert 到 HEAD(“他们的”)修订版本。
  2. 在 Query Analyzer 中打开脚本,连接到正确的数据库
  3. 执行脚本
  4. 如果第 3 步生成了错误,请找出导致错误的约束。在 DELETE FROM the_current_table 行的上方,添加:ALTER TABLE table_that_contains_the_constraint DROP CONSTRAINT FK_the_name_of_the_annoying_constraint,然后重试第 3 步。重复此操作,直到脚本无错误地执行。
  5. 重复步骤 1 到 4,直到所有数据更改都已完成。
  6. 重新脚本化您的数据库。如果在第 3 步中删除了任何约束,请通过执行适当的关系脚本来重新创建它们(SVN Revert 文件,删除仍存在的约束的行,执行)

重要提示:请注意启用了 CASCADE DELETE 的关系!删除源控制表中的数据可能会导致其他(可能未源控制的)表中的数据丢失!!

处理/解决次要脚本差异

在某些情况下,生成的脚本可能会出现差异,但实际上它们并没有什么不同。以下是如何解决它们

  1. 索引/主键名称:要解决主键或索引名称的差异,请在 SQL Query Analyzer 中执行:sp_rename 'myname', 'theirname'
  2. 表和列名称的区分大小写差异:执行 sp_rename 'dbo.Table.someColumn', 'SomeColumn'
  3. CREATE 语句的区分大小写差异:出于某种奇怪的原因,SQL Server 会记住 CREATE 语句执行时的大小写。对于除表以外的任何其他对象,请将您版本的 .sql 文件 SVN Revert 到 HEAD 修订版本,在 Query Analyzer 中打开文件并执行它。
  4. 排序规则差异:这些可能非常令人头疼。如果团队中的开发人员在 SQL Server 中使用不同的排序规则设置,则 varchartext 等文本列将包含不同的排序规则。请确保所有人都使用相同的排序规则设置!如果您不介意不同的排序规则设置,可以选择在工具的 .config 文件中打开“IgnoreCollation”。

处理冲突

有时脚本文件中会出现冲突。这通常是因为在本地数据库更改完成后未提交生成的脚本。解决冲突的最佳方法是

  1. 重新生成您的脚本,任何冲突文件都会被自动删除。
  2. 现在,检查 Diff 并对您的数据库进行任何待定更改。
  3. 再次重新生成脚本并提交您的文件。

最佳实践

遵循这些准则,以防止自己陷入麻烦。

  • 尽快将本地数据库更改提交到 SVN 存储库,但前提是与该数据库更改相关的任何编程代码都同时提交。如果更改可能会破坏其他开发人员正在使用的代码,请在同一提交中提供修复这些问题的代码。
  • 安排每天至少一次自动 SVN Update 和脚本工具的执行,以便您尽快注意到已提交的数据库更改。早上 9 点是为此设定一个好时间:新的一天,新的脚本。
  • 一旦注意到其他用户的数据库更改,请立即处理。拖延只会让您的工作变得困难。
  • 将 ScriptDB4SVN.exe 的副本放入包含脚本的文件夹中,并将其添加到存储库。如果出现更新版本,您可以直接用新版本覆盖。其他开发人员在 SVN Update 后会自动获取新版本。
  • 如果您从数据库中删除了表/视图/其他内容,请不要删除相应的脚本文件!脚本文件的内容将由该工具自动清除。这样,其他开发人员就能注意到删除操作。一旦-每个人-都删除了该项,该文件就可以从 SVN 中移除了。

历史

  • 2006 年 10 月 8 日:发布原始文章。
© . All rights reserved.