3

有不止一个文件系统

大多数版本控制工具在本地磁盘文件系统上运行。

大多数关系数据库系统的数据库对象确实存在于文件系统中,因为存在标识对象的文本名称,并且可以检索或至少使用该名称生成创建脚本。

但它不是本地磁盘文件系统,因此对于严格在本地磁盘文件系统上运行的 CVS 或 SVN 等工具来说,它们是不可见的。

为了将 SVN 应用于数据库对象,必须将它们复制到本地磁盘文件系统中,并且必须将本地磁盘文件系统的更改复制到数据库中。

不同的使用方式

与每个开发人员维护一个私有工作副本的源代码不同,开发人员倾向于在网络某处的服务器上的共享数据库上工作。虽然 Visual Studio 为数据库的按需安装项目本地副本提供直接支持,但开发人员已避开此功能,因为没有方便且可靠的方法来合并更改。

但是,一旦数据库结构的更改由 CVS 或 SVN 等复制合并版本控制系统管理,传播和合并将大部分是自动的(条冲突),不再有任何理由共享数据库。

排除 SCC 作为选项

Microsoft SQL Management Studio 支持任何实现 SCC 规范的版本控制。微软只列出了 VSS (blech),但谷歌显示了过多的选项。然而,SCC 完全是关于锁定 - 双 blech。

在文件系统之间复制

整个问题现在转移到文件系统之间的复制之一。CodePlex 包含 VS2005/SQL2005 的实现,但它不适用于 VS2008/SQL2008。

在这一点上,我认为“我应该如何解决这个问题”的基本问题已经得到了令人满意的解决,尽管我不确定如何奖励积分。

感谢所有相关人员的意见。

确实会出现一些具体的问题,主要与如何编写各种类型的模式对象有关。

  • 如何按依赖顺序 提取create和脚本alter
    • 桌子
    • 看法
    • 存储过程
    • 功能
    • 扳机
    • 指数
    • 外键
  • 如何按依赖顺序提取表填充脚本
  • 如何有效地检测模式的更改(在没有触发器的情况下,sys.objects将需要轮询;这最好快速且便宜)

检测变化

我注意到可以使用策略将操作绑定到模式中的更改。仍然存在依赖排序和如何编写表创建语句脚本的问题

4

6 回答 6

4

我们使用 Red Gate 将当前模式与存储在 SVN 中的脚本文件进行比较,以获取基线、版本控制等

但是,我们的主参考实际上是生产的恢复副本。这是我们的基线,应该对应于 SVN。将主脚本提交到 SVN 是部署过程的一部分,Red Gate 非常有用:它只更改已更改对象的文件。

我们进一步分离了我们的工作脚本和发布脚本(仅限更改),因此我们在 SVN 中始终拥有一个主数据库和一个基线。我们只使用脚本进行开发。

数据库源代码控制是个好东西,但由于 SQL Server 对象的性质,实现起来具有挑战性:某些表中的一行或 3 行......

于 2009-10-20T20:25:08.993 回答
1

在过去六个月左右的时间里,我一直在开发一个名为 ShiftSchema 的工具,我认为它与您的问题相关。

ShiftSchema 使用数据库触发器将 SQL Server 2005 和 2008 数据库对象与磁盘上适合存储在版本控制系统中的文件同步。它还监视文件系统的更改(当您从存储库更新并获取另一个开发人员提交的架构更改时)并将这些更改推送到您的个人开发数据库中。

它确实支持同步数据,但该功能实际上是针对少量数据的,例如查找表。

它还具有用于比较两个数据库(在 RDBMS 中或在磁盘上)并生成 DDL 脚本以同步它们的工具。

ShiftSchema 旨在用于每个开发人员都有自己的个人开发数据库的开发环境。

如果您有兴趣,我的个人资料中的网站链接指向 ShiftSchema 网站。

于 2009-10-22T12:13:57.953 回答
1

Red Gate 正在构建 SQL 源代码控制,与 SSMS 集成以提供对源代码控制的提交和检索(在后台,我们将数据库对象链接到源代码控制中保存的相应创建 SQL 文件)。尽管我们建议每个开发人员使用他们自己的数据库开发副本,但我们计划支持共享模型,尽管这有一个缺点,即任何开发人员都可以立即为每个人破坏数据库。

我们希望在 2010 年上半年发布该工具。如果您想了解更多信息,或注册我们的抢先体验计划,请访问以下链接:

http://www.red-gate.com/products/SQL_Source_Control/index.htm

亲切的问候,

Red Gate Software 产品经理 David Atkinson

于 2009-10-25T18:13:22.453 回答
1

在一个非常简单的级别上,您可以编写一个 Windows 服务来监视文件系统并解析 aprticuler 目录中的文件并将它们应用于数据库。可以使用使用 SQL 服务器代理(或仅触发器和 xp_commandshell)的类似 mechinsim 来编写反向操作。

于 2009-10-19T02:50:03.143 回答
0

wrt 其他用户直接对 SQL 服务器所做的更改:我不知道这对您来说有多实用,但通过 SQL 脚本而不是单独地直接在服务器上进行所有更改可能是个好主意。这些 SQL 脚本可以编号并放置在您选择的源代码控制中。为了更好地控制已部署的更改,您可以将每个更改脚本与一个回滚脚本配对,如果需要,可以使用该脚本。

您当然需要教育用户,实施一些控制等,并调整部署过程,以便只有经过批准的更改才能通过脚本流向数据库环境。不过只是一个想法。

于 2009-10-20T03:48:30.623 回答
0

您是否一定需要跟踪对对象所做的每一次更改,还是只跟踪最后一次?我们用 C# 编写了一个针对 TFS 的解决方案,因为我们有数据库中所有 SQL 对象的基线,然后使用 Microsoft.SqlServer.Management.Smo 中的方法,我们只需遍历每个数据库对象并比较“工作集” ' 到服务器版本。我们在晚上运行它作为我们夜间处理的一部分,它需要大约 15 分钟才能通过 9 个数据库的整个服务器。我们发现它运行良好,不涉及对 SQL 服务器/数据库的任何直接修改,并且适用于 SQL 2005/2008。它会生成一份报告,并邮寄给我们的数据库管理员,让他们知道哪些对象发生了变化,然后允许他们通过 TFS 并查看发生了什么。

我最初是从这里开始的; http://odetocode.com/blogs/scott/archive/2008/02/02/versioning-databases-change-scripts.aspx

但发现我正在寻找的不是将更改推送到服务器的方法,而是简单地了解更改。博客链接有一些不错的建议,希望对您有所帮助。

问候。

于 2009-10-21T13:43:53.973 回答