4

据我了解,如果我想让我的数据库处于源代码控制之下,那么我需要检查每个更改的更改脚本,然后从某个修订版运行它们以获得正确的数据库。

我正在尝试制作一个也将被签入的批处理文件,它允许团队中的其他开发人员在本地重新构建数据库而不会带来太多麻烦。我相信 sqlcmd 是实现这一目标的方法。我将其设置为枚举 .sql 文件目录中的所有文件并为每个文件运行 sqlcmd。

我的问题是谁以前做过这件事,你对实现这一目标的最佳方法有什么建议吗?我打算这样做的方式是最好的方式还是有更好的方式?

希望这不是太模糊。

提前致谢,

马丁。

4

5 回答 5

3

如果您使用像 NHibernate 这样的 ORM 工具,您可以省去使用数据库更改脚本的麻烦,因为 ORM 可以从它的映射文件(受源代码控制)重新创建数据库。

这是为每个修订提供适当的数据库版本的一种非常简单的方法。

然后,我还会在执行测试时重新创建整个模式,以确保我有一个一致的状态。

我最近写了一篇博客: http ://www.tigraine.at/2008/10/30/sourcecontrol-and-databases-when-orm-comes-in-handy/

我也曾经有一个项目有 Sql 更新脚本,我们只是构建了一个小帮助工具(非常基本),它打开文件夹,对所有脚本进行排序(我们将它们命名为 1 - foo.sql,2 - bar.sql ) 并按顺序对数据库执行它们。

如果开发人员有一个新脚本,他只需将其添加到末尾(34 - bla bla.sql)。

于 2008-11-11T10:38:41.837 回答
3

我开发了一个小实用程序,通过将表、SP、触发器和视图导出到文本文件来帮助我对其进行版本控制:gljakal 的 Sql Exporter。它有一个 GUI 模式和一个命令行模式(所以我可以在批处理文件中使用它)。

适用于 SQL 2005+。

于 2008-11-11T17:40:37.397 回答
0

要注意的一件事是您需要按依赖顺序创建对象。所以你不能简单地迭代文件。

我们最终得到了一个批处理文件,该文件将按依赖顺序列出所有对象

实际上我们有 2 个批处理文件,其中一个叫做 createDBObject.bat:

:: Parameters Required:
:: %1 UserID
:: %2 Password
:: %3 Server
:: %4 Database
:: %5 file with scripted object
::
echo. >> CreateDBObjectsLog.txt
echo  %5 >> CreateDBObjectsLog.txt
osql -U%1 -P%2 -S%3 -i%5 -d%4 -n >> CreateDBObjectsLog.txt
echo * %5

然后另一个包含所有 db 对象的列表:

:: Parameters Required:
:: %1 UserID
:: %2 Password
:: %3 Server
:: %4 Database
::
echo object  in %4 database on %3 server
echo Please Wait ...

if exist CreateDBObjectsLog.txt del CreateDBObjectsLog.txt


call createDBObject.bat %1, %2, %3, %4, ScriptedTable1
call createDBObject.bat %1, %2, %3, %4, ScriptedTable2
...
call createDBObject.bat %1, %2, %3, %4, ScriptedTableN

call createDBObject.bat %1, %2, %3, %4, ScriptedView1

call createDBObject.bat %1, %2, %3, %4, ScriptedSP1

etc

现在我们使用SQL Compare Pro自动执行所有这些任务

您还可以查看相关问题:RedGate 是否有“穷人的”替代方案来编写整个数据库模式的脚本?

于 2008-11-11T10:38:08.623 回答
0

如果您的公司愿意投资一些好的工具,那么值得检查SQL Compare Pro。它非常适合自动化/简化您描述的任务。他们提供 14 天的免费完整功能试用版,因此您可以在投资之前对其进行测试。

于 2008-11-11T11:03:04.470 回答
0

关于 OR 映射框架能够创建模式,这是一个有趣的观点——我没有想到这一点。我实际上使用的是 LINQ To SQL,但我相信仍然可以通过 CreateDatabase() 调用重新创建架构和数据库。

有没有其他人通过 LINQ To SQL 采用这种方法进行数据库源代码控制?

于 2008-11-11T11:05:45.137 回答