Sql server 如何使用SMO scripter生成sql脚本

Sql server 如何使用SMO scripter生成sql脚本,sql-server,powershell,smo,Sql Server,Powershell,Smo,我的数据库包含表、视图和所有内容。我需要一种自动为所有DDL生成SQL脚本的方法。不需要数据 存在FK约束,因此表创建脚本应该正确排序。有些视图使用另一个视图,因此视图创建脚本也必须正确排序 从上展示的脚本开始,我得到了以下内容: 函数生成SqlScript { param( [字符串]$srvname, [string]$database, [字符串]$ScriptOutputFileName ) [System.Reflection.Assembly]::LoadWithPartialNam

我的数据库包含表、视图和所有内容。我需要一种自动为所有DDL生成SQL脚本的方法。不需要数据

存在FK约束,因此表创建脚本应该正确排序。有些视图使用另一个视图,因此视图创建脚本也必须正确排序

从上展示的脚本开始,我得到了以下内容:

函数生成SqlScript
{
param(
[字符串]$srvname,
[string]$database,
[字符串]$ScriptOutputFileName
)
[System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.SqlServer.SMO”)| out null
$srv=新对象(“Microsoft.SqlServer.Management.SMO.Server”)($srvname)
$allUrns=@()
$allUrns+=$srv.Databases[$database].Tables | foreach{$\.Urn}
$allUrns+=$srv.Databases[$database].Views | foreach{$\uu.Urn}
$scriptingOptions=新对象(“Microsoft.SqlServer.Management.SMO.scriptingOptions”)
$scriptingOptions.WithDependencies=$true
$scriptingOptions.AllowSystemObjects=$false
$scriptingOptions.ToFileOnly=$true
$scriptingOptions.Permissions=$true
$scriptingOptions.FileName=“$ScriptOutputFileName”
$scripter=新对象(“Microsoft.SqlServer.Management.SMO.scripter”)($srv)
$scripter.Options=$scriptingOptions;
$scripter.Script($allUrns)
}
生成SqlScript。\sqlexpress
现在的问题是,WithDependencies选项会导致视图脚本包含其依赖表,这在前面已经包含。若我去掉WithDependencies选项,生成的脚本并不能反映正确的顺序

因此,最终结果包含所有信息,但无法运行。由于无法创建两次表,因此会引发错误。


我发现有太多关于SMO scripter的帖子,所以我想一定是我错过了什么。或所有这些帖子都忽略了这个问题吗?

您可以采取不同的方法,编写表格脚本,然后编写视图脚本。一般来说,按照这个顺序,事情都会发生,但不是100%


我会将WithDependencies设置为false,这无疑是一种黑客行为,但您可以在运行脚本之前通过添加错误处理来修补脚本。您可能可以利用V3中的新解析器来实现自动化

在编写对象脚本之前,您需要在PowerShell脚本中按依赖关系顺序查找和排序表。在以下博客上查看此功能的实现:

这个概念在C#中对我来说更清楚。退房:

  • 编写所有不带外键的表的脚本,然后只编写外键的脚本。您可以通过使用脚本选项来实现这一点,这样,表之间由于FKs而产生的依赖关系就无关紧要了
  • 使用SMO对象。您可以将视图的URN添加到其中,然后要求提供依赖项的线性列表。我对一个类似问题的回答包含了一个如何使用它的示例

  • WithDependencies做两件事:1)它按依赖项重新排序脚本。2) 它自动包含依赖元素。如果我使用依赖项,我将不会有任何来自#2的问题,但我需要手写来实现#1。这是可行的,只是想确保对任何想这样做的人的期望是正确的。谢谢你的回答。我“奖励”了Renegrin,但你的也一样好。我真希望有办法分掉这笔赏金。由于不相关的原因,我的解决方案最终变成了不同的方法。