如何保持代码库和数据库模式同步?

5
最近在我工作的项目中,我们一直在努力保持解决方案的代码库和相关数据库架构的同步(数据库= SQL Server 2008)。
数据库经常发生改变(添加列、约束、关系等),因此人们从源代码控制中获取最新版本并需要重新构建数据库(有时会忘记做后者)也是很常见的事情。
我们没有使用VSTS: Database Edition(DataDude),而是使用带有脚本(批处理文件)的标准Visual Studio数据库项目,该脚本通过T-SQL脚本拆除并重建数据库。该解决方案是一个.Net和ASP.net解决方案,其底层使用LINQ to SQL作为ORM。
有没有想法可以应对这种情况(自动化或非自动化),以便让每个人都了解最新的数据库架构?
使用MSBuild进行持续集成是一个选择,但只能帮助捕捉到被提交的任何破坏性更改,它并不能真正帮助解决上面提到的情况。
我们正在使用Team Foundation Server,如果有帮助就请提供。

哎呀!这真是太痛苦了。特别是如果表格中还有必须要有的数据的话。 - Al W
8个回答

4
我们尝试从创建脚本开始工作。
也就是说,除非经过测试并检入源代码控制,否则不允许更改数据库。
但这假设数据库团队与您的应用程序团队集成在一起,而在大型项目中通常并非如此...
(我很想回答“非常困难”)
编辑:如果流程不正确,工具也无法帮助您。

你使用哪些工具进行源代码控制?在服务器上,源代码控制模式通常以多久的频率“构建”? - jandersson
我们有一个中央“测试”服务器,作为我们的CI心跳,一个很好的健全性检查,确保代码仍然有效。即使您没有工厂(Cruise Control等),也不要紧。SVN。 - Spence
这是一个很好的答案,基本上符合我们的需求,但 Rob Gould 的答案实际上为我们解决了问题。虽然投了个赞 :) - RobS

2

好的,尽管这不是全部解决方案,但您应该在应用程序代码中包含一个断言,以链接到数据库并断言正在使用正确的模式,这样至少就会变得明显,并且可以避免出现静默错误和人们抱怨突然出现的问题。

至于模式版本,您可以使用某些特定于数据库的功能(如果可用),但我个人更喜欢声明一个模式版本表并将版本号保存在其中,这样它就是可移植的,并且可以通过简单的选择语句进行检查。


这不是一个坏主意。我同意第二部分 - 运行单元测试可以快速检测模式是否不同步(每个模式更改都与更新的单元测试配对),但第一部分很有趣。 - RobS
你可能还应该提供一个源文件,使用任何语言,在每次检查时都会将其检入源代码中,其中定义了当前模式版本,这样人们就可以按照需要访问版本信息,假设你不控制数据库适配器代码。 - Robert Gould

1

看看DB Ghost - 你可以使用脚本生成器在几秒钟内创建一个dbp,然后通过变更管理器管理所有数据库代码。www.dbghost.com

这正是DB Ghost所设计的处理方式。


这与Red Gate的SQL工具套件有很大不同吗? - RobS
我已经使用DbGhost十年了,它从未让我失望。他们提供的支持是首屈一指的。在我看来,Innovartis真正理解变更管理,胜过RedGate工具。 - penderi

0

我们基本上和你们一样,将生成脚本也纳入源代码控制。我是指定的数据库管理员,因此所有对脚本本身的更改都通过我完成。人们会把他们所做的更改的脚本发送给我,我会更新模式的主要副本,运行生成脚本(SSMS)以生成新的数据库脚本,然后进行检查。我保持我的代码副本与其他地方正在进行的任何更改同步。我们是一个小型公司,所以这对我们来说效果很好。我意识到它可能不具备可扩展性。


这基本上是目前项目的工作方式 :) 我想当模式更改被提交时,我可以通知人们...虽然通常不会影响每个人。 - RobS

0

如果您没有使用Visual Studio数据库专业版,则需要另一个工具,可以将数据库分解为其基本组成部分,以便更轻松地进行管理和更改。

如果您想在所有数据库更改和更新上保持清晰头脑,我建议认真考虑Redgate的SQL工具


我们将每个对象分解成自己的源文件,以便我们可以针对每个表/存储过程等进行版本控制。 - RobS
如果你可以在没有使用软件/自动化工具的情况下全部管理好,那就很厉害了。 - icelava
现在还为时过早 - 等到项目更加成熟(并且我们获得了生产质量的测试数据),我们将需要使用Red Gate的套件。 - RobS

0
使用类似RedGate SQL Compare的工具来生成数据库任意版本之间的模式更改。然后,您可以将该文件检入源代码控制。

0

看看这个问题:动态修补数据库。我认为它与您的问题足够相似,可以提供帮助。


0
我的解决方案很简单。将所有内容定义为XML,并确保数据库、ORM和UI都是从此XML生成的,没有例外。这样,您可以使用代码生成工具快速重新生成数据库创建脚本,它将更改模式同时(希望)保留一些数据。这需要一些努力,但最终结果非常值得。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接