我正在创建一个 Powershell 脚本来读取源数据库中的所有对象,编写脚本,然后在一个空的目标数据库中重新创建它们(可能跨不同的 SQL Server 版本)。在大多数情况下,我的脚本运行良好,并帮助识别了一些旧过程和函数中的一些陷阱,但我无法用它来编写 CLR 函数的脚本。
只有一两个,如果我在 SSMS 中右键单击它们并为新的查询编辑器窗口创建脚本,它工作正常,然后我可以在目标数据库上运行它并创建程序集,但是当我尝试使用 SMO 时Powershell 它只是不编写程序集的脚本(它也不会出错)。本质上,这是我的脚本(省略了创建连接/数据库对象等的位):
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类没有 schema 属性 - 所以这个过滤器会默默地删除任何潜在的结果:
我不确定您是需要使用
owner
过滤器中的属性还是完全忽略所有权。