为 SQL Server 数据库版本控制生成数据库脚本

Posted

技术标签:

【中文标题】为 SQL Server 数据库版本控制生成数据库脚本【英文标题】:Generating database scripts for SQL Server database versioning 【发布时间】:2012-01-25 16:14:50 【问题描述】:

在负责任的编程和版本控制范围内,我想开始对我的数据库更改进行版本控制,特别是因为我正在开发我的数据库实例,然后将其移至生产环境。我还没有发现任何对我来说真正有意义的事情。我使用 Visual Studio 2010 Pro 作为我的 IDE。是否有一个文档可以使这个过程变得简单并且能够相对容易地检测到数据库的更改?或者我应该在我的工作流程中进行哪些更改以使其更容易?

【问题讨论】:

【参考方案1】:

我过去成功完成此类事情的一种方法是通过Sql Source Control。 Visual Studio 不为您提供此功能。

或者,您可以使用 SSMS 为您生成数据库脚本并将其保存为文件;然后您可以签入脚本。您可以选择是在一个文件中生成整个 DB 脚本,还是逐个对象生成。同步部分必须由您通过在生产中执行脚本来完成。总之,一场噩梦

Redgate 还提供 Sql Compare,非常适合同步数据库。如果您或您的公司负担得起,请查看他们的产品。

【讨论】:

哦...我喜欢那个包裹的外观。 在 VS2010 中 - 您可以将对象从服务器资源管理器拖到项目资源管理器中以编写数据库对象的脚本。【参考方案2】:

我们在内部使用自己的数据库解决方案,该解决方案提供了正确的数据库版本控制所需的所有工具。虽然我意识到它可能不是每个人的完美解决方案,但我邀请您看看它(它是开源的):bsn ModuleStore

版本控制方面如下:该工具可以半自动地编写 SQL 脚本,并且它确实将源代码重新格式化为统一格式。因此,无论何时以及由谁编写脚本,对于相同的源文件将始终相同;因此,这适用于非锁定源代码控制系统(尤其是 SVN、Git 或 Mercurial)。

重新格式化将所有语句以相同的形式(例如处理可选关键字,如@9​​87654322@、INNEROUTER 等),将所有内容编写到“dbo”模式中(即使它在一个不同的),将所有标识符放入方括号([something]),将所有保留字大写,缩进等。

除了版本控制之外,该工具的运行时部分可以区分正在运行的 DB 和 CREATE 脚本(DB 源代码),并自动为所有非破坏性更改应用更新(例如更新索引、约束、视图、存储过程、触发器、自定义类型、新表等)。必须手动编写破坏性更改(表更改通常需要数据转换)。运行时将确保所有更新都在事务中执行,如果生成的数据库与 CREATE 脚本不匹配,则回滚,因此您可以安全地知道数据库正好在应用程序所需的版本上,即使它已被人为篡改。

此外,多个“模块”可以在一个数据库中使用。每个模块都存储为一个模式,并且独立于其他模式,因此可以从一个数据库中添加或删除模块,并避免为应用程序的不同部分创建多个数据库。此外,使用模式来执行此操作可确保没有名称冲突。

值得注意的是,该工具集不依赖于 SMO,它是自治的。

【讨论】:

【参考方案3】:

将您的数据库脚本保存在 SVN。这是参考 How to use SVN Tortoise

将您的数据库脚本保存在 VSS 中。这是参考 What is VSS ? How can we use that ?

在这两种情况下,您都可以跟踪所做的更改,以便将来您可以检查以版本形式保存的历史记录。

您也可以使用红门产品

编辑

你如何找出改变了什么?

使用比较功能检查以前版本中所做的更改。

如何将更改应用到实时数据库服务器?

从服务器下载最新文件。

我希望您没有在合并脚本中对表使用 Drop 语句。因为它会从表中删除所有记录。

将针对 Stored Pro、View、Function 等进行删除语句。

请注意,您必须使用以下提到的行动计划在生产服务器上运行完整的最新数据库脚本文件

1. Remove Drop Statement for Schema DDL
2. Add Drop/Create Statements for Stored Proc/Views
3. Include Alter statements DML of schema.

希望这对你有帮助。

【讨论】:

这并不能真正回答问题。我知道如何使用 SVN,但我不知道如何对数据库进行版本控制。 请再次阅读答案。提到这些产品创建完整数据库/数据库单个脚本的历史记录。这里要注意的一点是,您需要将完整的数据库脚本保存在任一产品中,以便下次您可以根据需要比较更改。我希望这现在可以进一步澄清:) 我知道如何使用 SVN,两篇文章都没有提到与 SQL Server 集成和显示差异的任何内容。您的解决方案是只拉一个新脚本?你如何找出改变了什么?如何将更改应用到实时数据库服务器? 好的,所以你说的是手动创建脚本。我知道自动创建并不总是可靠的,但如果可能的话,这是一个起点。我们过去没有做过这样的事情。

以上是关于为 SQL Server 数据库版本控制生成数据库脚本的主要内容,如果未能解决你的问题,请参考以下文章

Sql Server本地高版本备份数据备份至远程低版本数据库方法

如何转换SQL Server 2008数据库到SQL Server 2005

SQL server 2008 r2附加数据库出现错误了,见下图,怎么解决?求帮助!!!!!

从 SQL Server Express 生成的数据库是不是可以与 SQL 的主要版本一起使用?

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

SQL Server 2016 无法将系统版本控制添加到关系表