私のデータベースには、テーブル、ビュー、およびすべてがあります。そして、自動化された方法ですべての DDL の SQL スクリプトを生成する方法が必要です。データは必要ありません。
FK 制約があるため、テーブル作成スクリプトは適切に順序付けする必要があります。一部のビューは別のビューを使用するため、ビュー作成スクリプトも適切に並べる必要があります。
MSDN ブログで提示されたスクリプトから始めて、次のようになりました。
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 スクリプターについて話している投稿が多すぎるので、見落としているものがあるに違いないと思います。それとも...これらの投稿はすべてこの問題を見逃していましたか?