Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何使用正确的对象顺序编写MS SQL Server数据库脚本?_Sql Server_Database_Sql Server 2005_Schema - Fatal编程技术网

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

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脚本,我必须再次运行它,以确保它首先创建依赖对象的对象。。。但我还没有遇到问题

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

这两种工具都将编写数据库对象的脚本,而不会出现问题,尽管这两种工具都没有按照正确的创建顺序编写对象的脚本。例如,该脚本可能会编写一个视图的脚本,该视图需要一个表,而该表直到稍后才会创建


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

我们使用它来创建db脚本,我必须再次运行它,以确保它首先创建依赖对象的对象。。。但我还没有遇到问题。

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

  • \u ddl:保存表更改,例如新列、索引、关系等
  • fn:存储函数
  • \u prc:存储过程
  • \u static:显然是“静态数据”,或部署时必须在数据库中的数据
  • \u选项卡:表格(创建脚本)
  • \u trg:触发器
  • \u视图:查看脚本
文件夹名称当然是我们的随机选择,您总是可以以不同的方式安排事情。之后,我们创建了一个批处理脚本,以按以下顺序将所有这些文件合并到一个SQL中:

  • _标签
  • _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/数据库版等)。

如果一个视图引用另一个视图,视图的顺序仍然必须正确。对于外键约束,表的顺序也必须正确。哇,我敢打赌,加上蚕豆和一杯好酒,一切都会好起来的!谢谢你的提示。我试用了试用版,看起来文件是按字母顺序生成的。如果外键约束是在创建所有表之后建立的,那么这实际上是很好的,但是它们不是。