私のデータベースにはテーブル、ビュー、およびすべてがあります。そして、すべてのDDLのSQLスクリプトを自動生成する方法が必要です。データの必要はありません。SMOスクリプトを使用して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オプションを取り除くと、生成されたスクリプトは適切な順序付けを反映しません。
したがって 最終結果にはすべての情報が含まれていますが、実行可能ではありません。テーブルを2回作成することはできないため、エラーが発生します。SMOスクリプタについては、あまりにも多くの記事でこれについて話していますので、私は逃したものがあると思います。または...これらの投稿はすべてこの問題を逃しましたか?
WithDependenciesは2つのことを行います:1)依存関係によってスクリプトを再注文します。 2)それは自動的に従属要素を含む。 WithDependenciesを取った場合、#2では何の問題もなくなりますが、#1を達成するためには手書きで書く必要があります。それは実行可能です、ただ期待していることが誰でもこれをしたいと思っているのかどうかを確認したいのです。 – kennethc