【发布时间】:2013-10-26 09:43:07
【问题描述】:
我的数据库有表、视图等等。而且我需要一种自动为所有 DDL 生成 SQL 脚本的方法。不需要数据。
存在 FK 约束,因此应正确排序表创建脚本。某些视图使用另一个视图,因此视图创建脚本也必须正确排序。
从MSDN Blog 上的脚本开始,我得到了以下信息:
function Generate-SqlScript
{
param(
[string]$srvname,
[string]$database,
[string]$ScriptOutputFileName
)
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | out-null
$srv = New-Object ("Microsoft.SqlServer.Management.SMO.Server") ($srvname)
$allUrns = @()
$allUrns += $srv.Databases[$database].Tables | foreach { $_.Urn}
$allUrns += $srv.Databases[$database].Views | foreach { $_.Urn}
$scriptingOptions = New-Object ("Microsoft.SqlServer.Management.SMO.ScriptingOptions")
$scriptingOptions.WithDependencies = $true
$scriptingOptions.AllowSystemObjects = $false
$scriptingOptions.ToFileOnly = $true
$scriptingOptions.Permissions = $true
$scriptingOptions.FileName = "$ScriptOutputFileName"
$scripter = New-Object ("Microsoft.SqlServer.Management.SMO.Scripter") ($srv)
$scripter.Options = $scriptingOptions;
$scripter.Script($allUrns)
}
Generate-SqlScript .\sqlexpress <MyDbName> <FilePath>
现在的问题是,WithDependencies 选项会导致视图脚本包含它的依赖表,这些表之前已经包含在内。如果我去掉 WithDependencies 选项,生成的脚本不会反映正确的顺序。
所以最终的结果包含了所有的信息,但它是不可运行的。由于无法创建表两次,因此会引发错误。
我发现有太多关于 SMO 脚本编写器的帖子,所以我想肯定有一些我错过了。或者……所有这些帖子都忽略了这个问题吗?
【问题讨论】:
标签: sql-server powershell smo