Estou criando um script Powershell para ler todos os objetos em um banco de dados de origem, fazer o script deles e recriá-los em um banco de dados de destino vazio (pode estar em diferentes versões do SQL Server). Na maioria das vezes, meu script funciona bem e ajudou a identificar algumas armadilhas em alguns procedimentos e funções antigas, mas não consigo fazer o script das funções CLR.
Existem apenas um ou dois e se eu clicar com o botão direito neles no SSMS e criar um script para a nova janela do editor de consultas, ele funcionará bem e posso executá-lo no banco de dados de destino e criar o assembly, mas quando tento usar o SMO em O Powershell simplesmente não faz o script dos assemblies (também não apresenta erros). Em essência, este é o meu script (deixou de fora os bits que criam as conexões/objetos de banco de dados, etc.):
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
Sinto que estou perdendo algo simples e óbvio porque posso obter tabelas, procs, funções, visualizações e similares sem nenhum problema. O que eu perdi?
A classe SqlAssembly não tem uma propriedade de esquema - então este filtro está removendo silenciosamente quaisquer resultados potenciais:
Não tenho certeza se você precisa usar a
owner
propriedade no filtro ou ignorar totalmente a propriedade.