ソースデータベース内のすべてのオブジェクトを読み取り、スクリプトを作成してから、空の宛先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
テーブル、プロシージャ、関数、ビューなどをまったく問題なく取得できるため、単純で明白なものが欠けているように感じます。私は何を逃したのですか?
SqlAssembly クラスにはスキーマプロパティがないため、このフィルターは潜在的な結果をサイレントに削除します。
$assemblies = $sourceDb.Assemblies | Where-object { $_.schema -eq $schema }
代わりにフィルターでowner
プロパティを使用する必要があるのか、所有権を完全に無視する必要があるのかわかりません。