internal/functions/Get-DbaSysDbUserObjectScript.ps1
function Get-DbaSysDbUserObjectScript { <# .SYNOPSIS Gets all user objects found in source SQL Server's master, msdb and model databases to the destination. #> [CmdletBinding()] param ( [parameter(Mandatory, ValueFromPipeline)] [Alias("ServerInstance", "SqlServer")] [DbaInstanceParameter]$SqlInstance, [PSCredential]$SqlCredential, [switch]$EnableException ) begin { function get-sqltypename ($type) { switch ($type) { "VIEW" { "view" } "SQL_TABLE_VALUED_FUNCTION" { "User table valued fsunction" } "DEFAULT_CONSTRAINT" { "User default constraint" } "SQL_STORED_PROCEDURE" { "User stored procedure" } "RULE" { "User rule" } "SQL_INLINE_TABLE_VALUED_FUNCTION" { "User inline table valued function" } "SQL_TRIGGER" { "User server trigger" } "SQL_SCALAR_FUNCTION" { "User scalar function" } default { $type } } } } process { try { Write-Message -Level Verbose -Message "Connecting to $SqlInstance" $server = Connect-SqlInstance -SqlInstance $SqlInstance -SqlCredential $SqlCredential } catch { Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source return } if (!(Test-SqlSa -SqlInstance $server -SqlCredential $SqlCredential)) { Stop-Function -Message "Not a sysadmin on $source. Quitting." return } $systemDbs = "master", "model", "msdb" foreach ($systemDb in $systemDbs) { $smodb = $server.databases[$systemDb] $destdb = $server.databases[$systemDb] Write-Output "USE $systemDb" Write-Output "GO" $tables = $smodb.Tables | Where-Object IsSystemObject -ne $true $schemas = $smodb.Schemas | Where-Object IsSystemObject -ne $true $transfer = New-Object Microsoft.SqlServer.Management.Smo.Transfer $smodb $null = $transfer.CopyAllObjects = $false $null = $transfer.Options.WithDependencies = $true $null = $transfer.ObjectList.Add($schema) $null = $transfer.Options.ScriptBatchTerminator = $true try { $transfer.ScriptTransfer() } catch { } Write-Output "GO" foreach ($table in $tables) { Write-Output "GO" $transfer = New-Object Microsoft.SqlServer.Management.Smo.Transfer $smodb $null = $transfer.CopyAllObjects = $false $null = $transfer.Options.WithDependencies = $true $null = $transfer.Options.ScriptBatchTerminator = $true $null = $transfer.ObjectList.Add($table) try { $transfer.ScriptTransfer() } catch {} } $userobjects = Get-DbaModule -SqlInstance $server -Database $systemDb -NoSystemObjects | Sort-Object Type Write-Message -Level Verbose -Message "Copying from $systemDb" foreach ($userobject in $userobjects) { Write-Output "GO" $name = "[$($userobject.SchemaName)].[$($userobject.Name)]" $db = $userobject.Database $type = get-sqltypename $userobject.Type $userobject.Definition $schema = $userobject.SchemaName $result = Get-DbaModule -SqlInstance $server -NoSystemObjects -Database $db | Where-Object { $psitem.Name -eq $userobject.Name -and $psitem.Type -eq $userobject.Type } $smobject = switch ($userobject.Type) { "VIEW" { $smodb.Views.Item($userobject.Name, $userobject.SchemaName) } "SQL_STORED_PROCEDURE" { $smodb.StoredProcedures.Item($userobject.Name, $userobject.SchemaName) } "RULE" { $smodb.Rules.Item($userobject.Name, $userobject.SchemaName) } "SQL_TRIGGER" { $smodb.Triggers.Item($userobject.Name, $userobject.SchemaName) } "SQL_TABLE_VALUED_FUNCTION" { $smodb.UserDefinedFunctions.Item($name) } "SQL_INLINE_TABLE_VALUED_FUNCTION" { $smodb.UserDefinedFunctions.Item($name) } "SQL_SCALAR_FUNCTION" { $smodb.UserDefinedFunctions.Item($name) } } $smobject = switch ($userobject.Type) { "VIEW" { $smodb.Views.Item($userobject.Name, $userobject.SchemaName) } "SQL_STORED_PROCEDURE" { $smodb.StoredProcedures.Item($userobject.Name, $userobject.SchemaName) } "RULE" { $smodb.Rules.Item($userobject.Name, $userobject.SchemaName) } "SQL_TRIGGER" { $smodb.Triggers.Item($userobject.Name, $userobject.SchemaName) } } if ($smobject) { $transfer = New-Object Microsoft.SqlServer.Management.Smo.Transfer $smodb $null = $transfer.CopyAllObjects = $false $null = $transfer.Options.WithDependencies = $true $null = $transfer.ObjectList.Add($smobject) $null = $transfer.Options.ScriptBatchTerminator = $true try { $transfer.ScriptTransfer() } catch {} } } } } } |