2013-10-17 33 views
7

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

答えて

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

1

テーブルとビューを別の方法でスクリプト化して表示できます。一般的には、この順番では動作しますが、100%ではありません。

私は、それは確かにハックですが、あなたはエラー処理を追加することによって、それを実行する前に、スクリプトにパッチを当てることができ、偽

+0

WithDependenciesは2つのことを行います:1)依存関係によってスクリプトを再注文します。 2)それは自動的に従属要素を含む。 WithDependenciesを取った場合、#2では何の問題もなくなりますが、#1を達成するためには手書きで書く必要があります。それは実行可能です、ただ期待していることが誰でもこれをしたいと思っているのかどうかを確認したいのです。 – kennethc

1

にWithDependenciesを設定します。おそらく、新しいパーサをV3で活用して、それを自動化することができます。

3
  1. スクリプトにすべてのテーブルを外部キーなしで、スクリプトを単に外部キーを。スクリプティングオプションを使用すると、FKによるテーブル間の依存関係は問題にならないでしょう。
  2. SMOオブジェクトDependencyWalkerを使用してください。ビューのURNをビューに追加し、依存関係の線形リストを要求することができます。同様の質問に対する私の答えhereには、それを使用する方法の例が含まれています。
+0

あなたの答えをありがとう。私はRenegrinに賞金を "授与"しましたが、あなたのものはまあまあです。私は賞金を分割する方法があることを望みます。私の解決策は無関係の理由で別のアプローチになってしまった。 – kennethc

関連する問題