web-dev-qa-db-ja.com

PowershellでSMOを使用してCLRアセンブリをスクリプト化できないのはなぜですか?

ソースデータベース内のすべてのオブジェクトを読み取り、スクリプトを作成してから、空の宛先DBに再作成するPowershellスクリプトを作成しています(SQL Serverのバージョンが異なる場合があります)。ほとんどの場合、私のスクリプトはうまく機能し、いくつかの古いプロシージャと関数のいくつかの落とし穴を特定するのに役立ちましたが、CLR関数をスクリプト化することはできません。

1つまたは2つしかないので、SSMSでそれらを右クリックして、新しいクエリエディターウィンドウへのスクリプトを作成すると、正常に機能し、宛先DBで実行してアセンブリを作成できますが、SMOを使用しようとするとPowershellは、アセンブリのスクリプトを作成しません(エラーも発生しません)。本質的に、これは私のスクリプトです(接続/ DBオブジェクトなどを作成するビットは省略されています):

Write-Host "Getting DB objects..."
$assemblies     = $sourceDb.Assemblies | Where-object { $_.schema -eq $schema  } 

# Set scripter options to ensure only schema is scripted
$scripter.Options.ScriptSchema  = $true;
$scripter.Options.ScriptData    = $false;

#Exclude GOs after every line
$scripter.Options.NoCommandTerminator   = $false;
$scripter.Options.ToFileOnly            = $false
$scripter.Options.AllowSystemObjects    = $false
$scripter.Options.Permissions           = $true
#$scripter.Options.DriAllConstraints     = $true
$scripter.Options.DriForeignKeys        = $false
$scripter.Options.SchemaQualify         = $true
$scripter.Options.AnsiFile              = $true

$scripter.Options.Indexes               = $true
$scripter.Options.DriIndexes            = $true
$scripter.Options.DriClustered          = $true
$scripter.Options.DriNonClustered       = $true
$scripter.Options.NonClusteredIndexes   = $true
$scripter.Options.ClusteredIndexes      = $true
$scripter.Options.FullTextIndexes       = $true

$scripter.Options.EnforceScriptingOptions   = $true

function CopyObjectsToDestination($objects) {

    foreach ($o in $objects) { 

        if ($o -ne $null) {
            try {
                Write-Host "Writing " $o.Name
                $script = $scripter.Script($o)

                $destDb.ExecuteNonQuery($script)
            } catch {
                #Make sure any errors are logged by the SQL job.
                $ex = $_.Exception
                $message = $ex.message
                $ex = $ex.InnerException

                while ($ex.InnerException) {
                    $message += "`n$ex.InnerException.message"
                    $ex = $ex.InnerException
                }
                Write-Error $message
            }
        }
    }
}

# Output the scripts
Write-Host "Create assemblies in destination database..."
CopyObjectsToDestination $assemblies

テーブル、プロシージャ、関数、ビューなどをまったく問題なく取得できるため、単純で明白なものが欠けているように感じます。私は何を逃したのですか?

3
Steve Pettifer

SqlAssembly クラスにはスキーマプロパティがないため、このフィルターは潜在的な結果をサイレントに削除します。

$assemblies     = $sourceDb.Assemblies | Where-object { $_.schema -eq $schema  } 

代わりにフィルターでownerプロパティを使用する必要があるのか​​、所有権を完全に無視する必要があるのか​​わかりません。

4
Ed Harper