代码之家  ›  专栏  ›  技术社区  ›  Ian Suttle

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

  •  5
  • Ian Suttle  · 技术社区  · 16 年前

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

    这两个工具都可以毫无问题地编写数据库对象的脚本,尽管这两个工具都没有按照正确的创建顺序编写对象的脚本。例如,该脚本可能会编写一个视图的脚本,该视图需要一个表,直到下一行之后才能创建该表。

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

    5 回复  |  直到 16 年前
        1
  •  2
  •   GordonBy    16 年前

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

        2
  •  2
  •   dr Hannibal Lecter    16 年前

    我的答案会有点复杂,只有编写整个数据库的脚本(即,将所有内容都保存在SQL脚本中)它才能工作。我们在一个大型项目中所做的就是将脚本组织成以下结构:

    • γ-DDL :保留表更改,如新列、索引、关系等。
    • γ-干扰素 :存储函数
    • 中华人民共和国 :存储过程
    • 静态的 :显然,“静态数据”或部署时必须在数据库中的数据
    • 新标签 :表(创建脚本)
    • 钇铁石榴石 触发器
    • 透视图 查看脚本

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

    • 新标签
    • γ-DDL
    • 钇铁石榴石
    • 透视图
    • γ-干扰素
    • 中华人民共和国
    • 静态的

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

    这并不完美,但能完成任务。

        3
  •  1
  •   Mark Brackett    14 年前

    解决排序问题有一种天真但却出奇有效的方法:继续运行每个脚本。单个脚本最终将工作(在其他脚本首先运行之后)或脚本失败(在这种情况下,它是一个坏脚本)。你也许可以更快/更容易地发现一个坏脚本——但我从来没有必要这样做。

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

    如果你想更进一步,你可以把这个巨大的脚本分成单独的批,然后单独运行。现在,您可以跟踪需要什么订单才能让他们工作。只需按这个顺序重新组合它们,然后输出新脚本。它应该没有错误地运行。

    或者,花500美元购买一个已经这样做的工具(Redgate、Visual Studio Ultimate/Database Edition等)。

        4
  •  0
  •   Sam    16 年前

    莱克特的方法很好。可以使用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本机加密应用于数据库,因此拆卸可能不适用。我把所有的脚本都放在一个目录中,所以我想您可能需要修改这个脚本来做一些递归。

        5
  •  0
  •   Albert    16 年前

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