9

私のデータベースには、テーブル、ビュー、およびすべてがあります。そして、自動化された方法ですべての 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 スクリプターについて話している投稿が多すぎるので、見落としているものがあるに違いないと思います。それとも...これらの投稿はすべてこの問題を見逃していましたか?

4

4 に答える 4

6

オブジェクトをスクリプト化する前に、PowerShell スクリプトで依存関係の順序でテーブルを検出して並べ替える必要があります。次のブログでこの実装を確認してください: http://patlau.blogspot.com/2012/09/generate-sqlserver-scripts-with.html

この概念は、C# の方が明確でした。チェックアウト: http://sqlblog.com/blogs/ben_miller/archive/2007/10/18/scripting-tables-views-and-data-using-smo-part-3.aspx

于 2013-10-23T19:34:57.273 に答える
1

これは確かにハックですが、エラー処理を追加することで、実行する前にスクリプトにパッチを当てることができます。おそらく、V3 の新しいパーサーを活用して自動化できます。

于 2013-10-21T12:51:02.190 に答える
1

別のアプローチを取り、テーブルを作成してからビューを作成することもできます。通常、この順序で物事は機能しますが、100% ではありません。

WithDependencies を false に設定します

于 2013-10-19T13:47:24.697 に答える