Sql server 如何使用正确的对象顺序编写MS SQL Server数据库脚本?
我正在尝试将MS SQL Server 2005数据库编写为单个文件。到目前为止,我已经尝试使用SQL Management Studio和MS数据库发布向导 这两种工具都将编写数据库对象的脚本,而不会出现问题,尽管这两种工具都没有按照正确的创建顺序编写对象的脚本。例如,该脚本可能会编写一个视图的脚本,该视图需要一个表,而该表直到稍后才会创建Sql server 如何使用正确的对象顺序编写MS SQL Server数据库脚本?,sql-server,database,sql-server-2005,schema,Sql Server,Database,Sql Server 2005,Schema,我正在尝试将MS SQL Server 2005数据库编写为单个文件。到目前为止,我已经尝试使用SQL Management Studio和MS数据库发布向导 这两种工具都将编写数据库对象的脚本,而不会出现问题,尽管这两种工具都没有按照正确的创建顺序编写对象的脚本。例如,该脚本可能会编写一个视图的脚本,该视图需要一个表,而该表直到稍后才会创建 您知道如何按照对象创建的正确顺序编写数据库模式的脚本吗?我们使用它来创建db脚本,我必须再次运行它,以确保它首先创建依赖对象的对象。。。但我还没有遇到问题
您知道如何按照对象创建的正确顺序编写数据库模式的脚本吗?我们使用它来创建db脚本,我必须再次运行它,以确保它首先创建依赖对象的对象。。。但我还没有遇到问题。
我的答案有点复杂,只有在为整个数据库编写脚本(即,将所有内容都保存在SQL脚本中)的情况下,我的答案才有效。我们在一个大型项目中所做的是将脚本组织成以下结构:
- \u ddl:保存表更改,例如新列、索引、关系等
- fn:存储函数
- \u prc:存储过程
- \u static:显然是“静态数据”,或部署时必须在数据库中的数据
- \u选项卡:表格(创建脚本)
- \u trg:触发器
- \u视图:查看脚本
- _标签
- _ddl
- _训练
- _观点
- _fn
- _中华人民共和国
- _静止的
它并不完美,但它完成了任务。莱克特有一个很好的方法。您可以使用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本机加密应用于数据库,因此分解可能不适用。我把所有脚本都放在一个目录中,所以我认为您可能需要修改这个脚本来执行一些递归。您可以在
这对我很有效。只要有可能,脚本都会按照正确的顺序创建(有些情况下,生成的脚本无法直接执行,但在大多数情况下它都能工作)有一种简单但出人意料的有效方法来解决排序问题:继续运行每个脚本。单个脚本最终要么工作(在其他脚本首先运行之后),要么失败>#个脚本(在这种情况下,它是一个坏脚本)。您可能能够更快/更容易地检测到错误脚本,但我从来没有必要这样做 如果你有一个巨型脚本,它可能是按GO语句拆分的。只要有唯一的GO语句,就足以运行多次。任何创建已存在对象的尝试都将失败,并中止批处理。下一批将不间断运行。最终,您创建了必要的对象,重新运行整个脚本将创建依赖对象(并且在已经创建的独立对象上失败)。但是,您永远无法让脚本在没有错误的情况下运行 如果你想变得更有趣一点,你可以把这个巨大的脚本分成单独的批,然后单独运行。现在,您可以跟踪使它们工作所需的顺序。只需按顺序重新组合它们,并输出新脚本。它应该没有错误地运行
或者,花500美元购买一个已经做到这一点的工具(RedGate、Visual Studio Ultimate/数据库版等)。如果一个视图引用另一个视图,视图的顺序仍然必须正确。对于外键约束,表的顺序也必须正确。哇,我敢打赌,加上蚕豆和一杯好酒,一切都会好起来的!谢谢你的提示。我试用了试用版,看起来文件是按字母顺序生成的。如果外键约束是在创建所有表之后建立的,那么这实际上是很好的,但是它们不是。