Partindo da mesma ideia de utilizar o objeto Scripter do SMO para gerar o scripts do SQL Server por .NET, agora veremos como fazer o mesmo procedimento com PowerShell:
# Referências [void][system.reflection.assembly]::loadfrom("C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Smo.dll") [void][system.reflection.assembly]::loadfrom("C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Management.Sdk.Sfc.dll") # Objetos $srv = new-object Microsoft.SqlServer.Management.Smo.Server(".\SQLEXPRESS") $db = $srv.Databases["DemoAspNet"] # Gerando o script do banco de dados $script = $db.Script() $script += "`nUSE [DemoAspNet]`n" # Relacionando as URNs dos objetos que serão "scriptados" [Microsoft.SqlServer.Management.Sdk.Sfc.Urn[]]$roles = $db.Roles | Where { $_.IsFixedRole -eq $FALSE } | % { $_.Urn } [Microsoft.SqlServer.Management.Sdk.Sfc.Urn[]]$schemas = $db.Schemas | Where { $_.IsSystemObject -eq $FALSE } | % { $_.Urn } [Microsoft.SqlServer.Management.Sdk.Sfc.Urn[]]$tables = $db.Tables | Where { $_.IsSystemObject -eq $FALSE } | % { $_.Urn } [Microsoft.SqlServer.Management.Sdk.Sfc.Urn[]]$views = $db.Views | Where { $_.IsSystemObject -eq $FALSE } | % { $_.Urn } [Microsoft.SqlServer.Management.Sdk.Sfc.Urn[]]$procs = $db.StoredProcedures | Where { $_.IsSystemObject -eq $FALSE } | % { $_.Urn } $urn = new-object Microsoft.SqlServer.Management.Smo.UrnCollection $urn.AddRange($roles) $urn.AddRange($schemas) $urn.AddRange($tables) $urn.AddRange($views) $urn.AddRange($procs) $scr = new-object Microsoft.SqlServer.Management.Smo.Scripter $scr.Server = $srv $scr.Options.DriAll = $TRUE # Gerando o script dos objetos pelo Scripter $script += $scr.Script($urn) # Salvando o script gerado em um arquivo $go = "`nGO`n" $script | % { $_ + $go} | Out-File "C:\Temp\DemoAspNet.sql"
Forma resumida para ser executado dentro do próprio contexto do SQL Server (Jobs, PowerShell do SQL Server ou sqlps.exe):
# Sem referências # Objetos sl SQLSERVER:\SQL\LOCALHOST\SQLEXPRESS $srv = get-item . sl Databases\DemoAspNet $db = get-item . # Gerando o script do banco de dados $script = $db.Script() $script += "`nUSE [DemoAspNet]`n" # Relacionando as URNs dos objetos que serão "scriptados" [Microsoft.SqlServer.Management.Sdk.Sfc.Urn[]]$roles = dir Roles | Where { $_.IsFixedRole -eq $FALSE } | % { $_.Urn } [Microsoft.SqlServer.Management.Sdk.Sfc.Urn[]]$schemas = dir Schemas | Where { $_.IsSystemObject -eq $FALSE } | % { $_.Urn } [Microsoft.SqlServer.Management.Sdk.Sfc.Urn[]]$tables = dir Tables | Where { $_.IsSystemObject -eq $FALSE } | % { $_.Urn } [Microsoft.SqlServer.Management.Sdk.Sfc.Urn[]]$views = dir Views | Where { $_.IsSystemObject -eq $FALSE } | % { $_.Urn } [Microsoft.SqlServer.Management.Sdk.Sfc.Urn[]]$procs = dir StoredProcedures | Where { $_.IsSystemObject -eq $FALSE } | % { $_.Urn } $urn = new-object Microsoft.SqlServer.Management.Smo.UrnCollection $urn.AddRange($roles) $urn.AddRange($schemas) $urn.AddRange($tables) $urn.AddRange($views) $urn.AddRange($procs) $scr = new-object Microsoft.SqlServer.Management.Smo.Scripter $scr.Server = $srv $scr.Options.DriAll = $TRUE # Gerando o script dos objetos pelo Scripter $script += $scr.Script($urn) # Salvando o script gerado em um arquivo $go = "`nGO`n" $script | % { $_ + $go} | Out-File "C:\Temp\DemoAspNet.sql"