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"
