您必须限制对所有数据库的访问,并且只允许开发人员访问本地数据库(他们开发的地方)和他们可以进行集成的开发服务器。最好的办法是让他们只能在本地访问他们的开发区域并通过自动构建执行集成任务。您可以使用 redgates sql compare 等工具对数据库进行比较。我建议您将所有更改保存在源代码控制(.sql 文件)下,这样您就可以了解谁在何时做了什么,并且可以在需要时恢复数据库更改。
我还希望能够让开发人员运行本地构建脚本来重新启动他们的本地开发箱。这样他们就可以随时回滚。更重要的是,他们可以创建集成测试来测试他们的应用程序(存储库和数据访问)的管道以及以自动化方式隐藏在存储过程中的逻辑。运行初始化(重置数据库),运行集成测试(在数据库中创建绒毛),重新初始化以将数据库恢复到干净状态等。
如果你是一个 SVN/nant 风格的用户(或类似用户),在你的存储库中有一个分支概念,那么你可以在 DotNetSlackers 上阅读我关于这个主题的文章:http: //dotnetslackers.com/articles/aspnet/Building-a- StackOverflow-inspired-Knowledge-Exchange-Build-automation-with-NAnt.aspx和http://dotnetslackers.com/articles/aspnet/Building-a-StackOverflow-inspired-Knowledge-Exchange-Continuous-integration-with-CruiseControl- NET.aspx。
如果你是一个 perforce 多分支的构建大师,那么你将不得不等到我写一些关于这种自动化和配置管理的东西。
更新
@Sazug:“是的,当我们使用基本脚本 + 附加脚本时,我们会使用某种多分支构建 :) 没有完整文章的那种自动化的任何基本技巧?” 最常见的数据库有两种形式:
- 您在新的非生产类型环境中控制数据库(仅限活动开发人员)
- 一个生产环境,您可以在其中积累实时数据
第一次设置要容易得多,并且可以从 dev 到 prod 完全自动化,并在需要时包括回滚 prod。为此,您只需要一个脚本文件夹,其中对数据库的每次修改都可以保存在 .sql 文件中。我不建议您保留 tablename.sql 文件,然后像使用 .cs 文件一样对其进行版本化,其中随着时间的推移,对该 sql 工件的更新实际上会在同一个文件中进行修改。鉴于 sql 对象彼此之间非常依赖。当您从头开始构建数据库时,您的脚本可能会遇到重大更改。出于这个原因,我建议您为每次修改保留一个单独的新文件,并在文件名的前面加上一个序列号。例如像 000024-ModifiedAccountsTable.sql 这样的东西。然后,您可以使用自定义任务或 NAntContrib 之外的其他内容,或直接执行众多 ??SQL.exe 命令行工具之一,针对从 000001-fileName.sql 到最后一个文件的空数据库运行所有脚本在 updateScripts 文件夹中。然后将所有这些脚本签入到您的版本控制中。而且由于你总是从一个干净的数据库开始,如果有人的新 sql 破坏了构建,你总是可以回滚。
在第二种环境中,自动化并不总是最佳途径,因为您可能会影响生产。如果您正在针对/针对生产环境积极开发,那么您确实需要一个多分支/环境,以便您可以在实际推动生产环境之前测试您的自动化方式。您可以使用与上述相同的概念。但是,您不能真正在 prod 数据库上从头开始,并且回滚更加困难。出于这个原因,我建议在您的构建过程中使用类似的 RedGate SQL Compare。.sql 脚本已签入以进行更新,但您需要在运行更新之前自动执行 staging db 和 prod db 之间的差异。然后,您可以尝试同步更改并在出现问题时回滚 prod。还,在自动推送 sql 更改之前,应采取某种形式的备份。在生产中做任何没有人眼观察的事情时要小心!如果您在所有开发/质量/暂存/性能环境中进行真正的持续集成,然后在推送到生产环境时执行一些手动步骤……那真的还不错!