用于从源代码管理重新创建数据库的批处理脚本

时间:2008-11-11 10:34:38

标签: sql-server version-control batch-file sqlcmd

据我所知,如果我想在源代码控制下获取数据库,那么我需要检查每个更改的更改脚本,然后从某个版本运行它们以获得正确的数据库。

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

我的问题是之前是谁做过这个,你有什么建议来实现这个目标吗?我打算以最好的方式做到这一点还是有更好的方式?

希望这不是太模糊。

提前致谢,

马丁。

5 个答案:

答案 0 :(得分:3)

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

这是为每个版本提供适当的db版本的一种非常简单的方法。

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

我最近在博客中写道: 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)。

答案 1 :(得分:3)

我开发了一个小实用程序,可以帮助我将表格,SP,触发器和视图导出为文本文件gljakal's Sql Exporter。它有一个GUI模式和一个命令行模式(所以我可以在批处理文件中使用它。)

适用于SQL 2005 +。

答案 2 :(得分:0)

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

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

实际上我们有两个批处理文件,一个叫做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自动完成所有这些任务

您还可以查看相关问题:Is there a “poor man’s” alternative to RedGate for scripting out entire database schema?

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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