6

我有一个数据库变更管理工作流程。它基于 SQL 脚本(因此,它不是基于托管代码的解决方案)。

基本设置如下所示:

Initial/
    Generate Initial Schema.sql
    Generate Initial Required Data.sql
    Generate Initial Test Data.sql
Migration
     0001_MigrationScriptForChangeOne.sql
     0002_MigrationScriptForChangeTwo.sql
     ...

启动数据库的过程是运行所有初始脚本,然后运行顺序迁移脚本。一个工具可以处理版本控制要求等。

我的问题是,在这种设置中,维护它是否有用:

Current/
    Stored Procedures/
        dbo.MyStoredProcedureCreateScript.sql
        ...
    Tables/
        dbo.MyTableCreateScript.sql
        ...
    ...

“这个”是指一个脚本目录(按对象类型分隔),它表示用于启动当前/最新版本的数据库的创建脚本。

出于某种原因,我真的很喜欢这个想法,但我无法具体证明它的需要。我错过了什么吗?

优点是:

  • 对于开发和源代码控制,我们将拥有与我们习惯相同的每个文件的对象设置
  • 对于部署,我们可以通过运行 Initial+Migrate 或通过从 Current/ 运行脚本将新的数据库实例启动到最新版本
  • 对于开发人员,我们不需要运行数据库实例来进行开发。我们可以在 Current/ 文件夹上进行“离线”开发。

缺点是:

  • 对于每次更改,我们都需要更新 Current/ 文件夹中的脚本,并创建一个迁移脚本(在 Migration/ 文件夹中)

提前感谢您的任何意见!

4

3 回答 3

6

实际上,这是最好的方法。尽管听起来很麻烦,但它比使用 SQL Compare 之类的工具或 VSDB .schema 文件部署的替代方案要好。一段时间以来,我一直在争论确切的 smae 方法:版本控制和您的数据库。我的应用程序从初始脚本部署 v1 架构,然后为每个版本运行升级脚本。每个脚本都知道如何从版本 N-1 升级到 N,仅此而已。最终结果是当前版本。

最大的缺点是缺乏权威的 .sql 文件,也无法查找任何对象(过程、表、视图等)的当前版本。但是,与任何以前的版本相比,能够部署您的应用程序的优势,以及通过良好控制和测试的脚本进行部署的优势远远超过了缺点。

如果您不喜欢使用此部署过程(部署 v1 的脚本,然后应用 v1.1,然后是 v1.2 ...直到最终应用 v4.5,当前),请记住这一点:使用完全相同的过程由 SQL Server 在内部升级版本之间的数据库。当您附加较旧的数据库时,您会看到著名的“数据库正在从版本 611 升级到 612”,并且您会看到升级是逐步进行的,不会直接升级到当前版本 651(或您的情况下的任何当前版本) )。升级也不会运行差异工具来部署 v 651 而不是 v. 611。那是因为最好的方法是您刚刚使用的方法,一次升级一个步骤。

并在发布一个相当倾斜的咆哮之后为您的问题添加一个实际答案(我对这个话题有强烈的看法,你能告诉我吗?):我认为拥有当前版本的脚本版本很有价值,但我认为它应该是一个连续的集成构建过程可交付成果。换句话说,您的构建服务器应该构建当前数据库(使用升级脚本),然后作为构建步骤,编写数据库脚本并使用当前版本模式脚本生成构建删除。但这些应该仅用作搜索和代码检查的参考,而不是作为部署交付物,我的 2C。

于 2010-03-23T22:20:29.900 回答
1

我认为从长远来看,这只会让事情变得更加复杂。整个版本需要存在于单个脚本中,以便您可以在一个上下文中测试该脚本并知道它将在另一个上下文(如生产)中正常工作。

于 2010-03-23T21:21:29.827 回答
0

马丁,

如果您在现实世界中,那么您的生产数据库只接受更新——您永远不会从头开始“创建”它。所以对你来说最重要的是存储、观看、审查等是更新脚本集。这些是将其投入生产的脚本,所以这些是唯一真正重要的脚本。

通过使它们成为主要内容,您正在做正确的事情。但是开发人员需要能够获得模式的“当前图片”。DBA 也喜欢这样做,尽管他们(太)经常通过登录生产服务器并启动某种 gui 工具来做到这一点。(哎呀!)

我对您的方法的唯一保留是object type的当前/先前模式。这些脚本应该通过转储数据库本身自动生成。如果您可以按类型自动对它们进行分类,那就太好了!如果没有,尽你所能使它们易于导航,但指导规则应始终“从实时数据库自动生成”。

于 2010-03-24T21:17:32.107 回答