如何使用正确的对象顺序编写MS SQL Server数据库脚本?

时间:2009-03-17 08:28:07

标签: sql-server database sql-server-2005 schema

我正在尝试将MS SQL Server 2005数据库编写为单个文件。到目前为止,我已尝试使用SQL Management Studio和MS数据库发布向导。

这两个工具都会编写数据库对象的脚本而没有问题,尽管这两个工具都没有按正确的创建顺序编写脚本对象。例如,脚本可能会编写一个视图脚本,该视图需要一个在下一行之前不会创建的表。

您是否知道如何使用正确的对象创建顺序编写数据库模式脚本?

5 个答案:

答案 0 :(得分:2)

我们使用它来创建db脚本,我必须再次运行它以确保它首先创建对象依赖...但我还没有遇到问题。 http://www.red-gate.com/products/SQL_Compare/index.htm

答案 1 :(得分:2)

我的回答有点复杂,只有当您编写整个数据库的脚本时才会起作用(即保留SQL脚本中的所有内容)。我们在一个大型项目中所做的是将脚本组织成以下结构:

  • _ddl :保存表格更改,例如新列,索引,关系等。
  • _fn :已存储的功能
  • _prc :存储过程
  • _static :显然,“静态数据”或部署时必须在数据库中的数据
  • _tab :tables(创建脚本)
  • _trg :触发器
  • _views :查看脚本

文件夹名称当然是我们的随机选择,您可以随时安排不同的事情。之后,我们创建了一个批处理脚本,按以下顺序将所有这些文件合并到一个SQL中:

  • _TAB
  • _ddl
  • _trg
  • _views
  • _fn
  • _prc
  • _static

关键技巧是以一种可以运行一千次的方式编写脚本。这意味着:在创建过程之前删除过程,在创建表之前检查表是否存在,在静态添加行之前检查是否存在行等。

这并不完美,但它完成了工作。

答案 2 :(得分:1)

解决排序问题有一种天真但令人惊讶的有效方法:继续运行每个脚本。单个脚本最终将起作用(在首先运行其他脚本之后)或失败>脚本数量(在这种情况下,它是一个糟糕的脚本)。您可能能够更快/更容易地检测到错误的脚本 - 但我从未需要。

如果你有一个巨大的脚本,它可能会被GO语句拆分。应该足够多次运行它,就像有独特的GO语句一样。任何尝试创建已存在的对象都将失败,并中止批处理。下一批将不间断地运行。最终,您创建了必要的对象 - 并且重新运行整个脚本将创建依赖对象(并且在已创建的独立对象上失败)。但是,您永远不会让脚本无错误地运行。

如果你想获得一点点发烧友,可以将巨型脚本分成单独的批次并单独运行。现在,您可以跟踪使它们工作所需的顺序。只需按顺序重新组合它们,然后输出新脚本。它应该没有错误地运行。

或者,花500美元购买已经完成此工作的工具(RedGate,Visual Studio Ultimate / Database Edition等)。

答案 3 :(得分:0)

莱克特有一个很好的方法。您可以使用powershell脚本(或其他语言)

连接这些脚本

运行脚本:

PS builddir:\> .\buildsql.ps1 -currentbuilddir "C:\Documents and Settings\sam\My Documents\svn\ticketing" -buildfile "sqlbuild.sql" -teardownfile
"teardown.sql"

powershell脚本:

param($currentbuilddir,$buildfile1,$teardownfile)

new-psdrive -name builddir -PSProvider filesystem -Root (resolve-path $currentbuilddir)

cd builddir:

rm $buildfile1
rm $teardownfile


Get-item Scripts_Build_1* | ForEAch-object {cat $_ >> $buildfile1; "GO --SYSTEM INSERTED GO--------------" >> $buildfile1} 

Get-item Scripts_Build_3* | ForEAch-object {cat $_ >> $teardownfile; "GO --SYSTEM INSERTED GO------------" >> $teardownfile} 

在这里,我正在删除一个构建文件并拆除文件 - 我实际上正在将sql本机加密应用于数据库,因此拆解可能不适用。我把所有脚本放在一个目录中,所以你可能不得不改变这个脚本做一些递归,我想。

答案 4 :(得分:0)

您可以在http://www.xsqlsoftware.com/Product/Sql_Schema_Compare.aspx尝试xSQL对象 它对我很有用。只要有可能,就会以正确的顺序创建脚本(在某些情况下,生成的脚本不能直接执行,但在大多数情况下它可以正常运行)