Tuesday, August 12, 2008

Mas scripts de SMO-SQL 2005 y PowerShell.

En el último post expuse algunos scripts de PowerShell para obtener diferentes propiedades de los servidores SQL 2005. En este post voy a continuar explicando algunos otros que también son muy útiles en una política de Disaster Recover de SQL 2005.

El primer script servirá para obtener el script para recrear los usuarios de cada base de datos y agregarlos en su rol correspondiente.

param ( [string] $serverName )
$RutaScripts = "c\scripts\"
[void][reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
$MyScripter=new-object ("Microsoft.SqlServer.Management.Smo.Scripter")
$srv=New-Object "Microsoft.SqlServer.Management.Smo.Server" $serverName
$MyScripter.Options.FileName = $f
$MyScripter.Options.AppendToFile = $true
$MyScripter.Server=$srv


write-host "Obteniendo el script para recrear los usuarios..."
foreach($db in $srv.databases) {
$f = [System.IO.Path]::Combine($RutaScripts, $nombre + "_Usuarios_" + $db.name + ".sql")
if ($db.Name -ne "master" -and $db.Name -ne "model" -and $db.Name -ne "msdb" -and $db.Name -ne "tempdb") {
$MyScripter.options.IncludeDatabaseContext = $true
foreach ($User in $db.Users) {
if ($User.Name -ne "sys" -and $User.Name -ne "dbo" -and $User.Name -ne "INFORMATION_SCHEMA" -and $User.Name -ne "guest") {
$MyScripter.Options.IncludeIfNotExists = $true
$MyScripter.Options.ScriptDrops = $true
$MyScripter.Script($User) | Out-file $f -append
}
if ($User.Name -ne "sys" -and $User.Name -ne "dbo" -and $User.Name -ne "INFORMATION_SCHEMA" -and $User.Name -ne "guest") {
$MyScripter.options.IncludeDatabaseContext = $false
$MyScripter.Options.IncludeDatabaseRoleMemberships = $true
$MyScripter.Options.ScriptDrops = $false
$MyScripter.Script($User) | Out-file $f -append
out-file -filePath $f -inputobject "`n" -append
}
}
}
}

El siguiente script sirve para obtener un script con los permisos de cada base de datos:
param ( [string] $serverName )
$RutaScripts = "c\scripts\"
[void][reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
$MyScripter=new-object ("Microsoft.SqlServer.Management.Smo.Scripter")
$srv=New-Object "Microsoft.SqlServer.Management.Smo.Server" $serverName
$MyScripter.Options.FileName = $f
$MyScripter.Options.AppendToFile = $true
$MyScripter.Server=$srv


write-host "Obteniendo el script de permisos de cada base de datos..."
foreach($db in $srv.databases) {
if ($db.Name -ne "master" -and $db.Name -ne "model" -and $db.Name -ne "msdb" -and $db.Name -ne "tempdb") {
$f = [System.IO.Path]::Combine($RutaScripts, $nombre +"_permisos_" + $db.Name + ".sql")
out-file -filePath $f -inputobject "USE $db `nGO`n"
foreach ($permiso in $db.EnumObjectPermissions()| where {$_.Grantee.ToString() -ne 'public'} ) {
$var=[string]$permiso.PermissionState+" "+$permiso.PermissionType+" ON "+$permiso.Grantor+"."+$permiso.ObjectName+" TO "+$permiso.Grantee
out-file -filePath $f -inputobject $var -append
out-file -filePath $f -inputobject "GO" -append
}
}
}

En los siguientes posts estaré dando más tips para establecer políticas de Disaster Recovery para servidores SQL 2000 o 2005.

1 comment:

Anonymous said...

Gracias.
Your work is very impressive and you have many scripts that every DBA should have.
I was wondering if you knew the options._____ flag for getting the user-owned schemas to be dropped before dropping the user?
Thanks for your site.

Keith