The following PS script was written by somone at MS, to enable searching each database in a SQL server, from a list of servers, for SQL database roles that are nested.
#*********************** # For each server runs a query against each database # # $InstanceList file should be a file of SQL instances in either server, server,port or server\instancename # #************************ param ( [string]$InstanceList = "C:\PowerShell\SQLServerList.txt" ) ## Get current date-time and assign to variable $currentDT = Get-Date # Load SMO assembly [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null; #Initialize Array to hold new database objects $iDatabases = @() #Loop over each instance provided foreach ($instance in $(get-content $InstanceList)) { try { "Connecting to $instance" | Write-Host -ForegroundColor Blue $srv = New-Object "Microsoft.SqlServer.Management.SMO.Server" $instance; #How many seconds to wait for instance to respond $srv.ConnectionContext.ConnectTimeout = 5 $srv.get_BuildNumber() | out-Null } catch {"Instance Unavailable - Could Not connect to $instance." | Write-Host -ForegroundColor Red continue } $srv.ConnectionContext.StatementTimeout = $QueryTimeout foreach($Database in $srv.Databases) { #create object with all string properties #populate object with known values $db = $database.Name $server = $srv.Name $Screen = "Server Name: " + $server + " Database Name: " + $db $Screen | ft $SqlConnection = New-Object System.Data.SqlClient.SqlConnection $ConnectHere = "Server=" + $server + ";Database=" + $db + ";Integrated Security=True" $SqlConnection.ConnectionString = $ConnectHere $SqlCmd = New-Object System.Data.SqlClient.SqlCommand #$SqlCmd.CommandText = "SELECT [Name] FROM [" + $db + "].[sys].[database_principals]" $q = "SELECT r.name, r.type, r.type_desc FROM [" + $db $q = $q + "].[sys].[database_role_members] j" $q = $q + " INNER JOIN [" + $db $q = $q + "].[sys].[database_principals] r" $q = $q + " ON j.role_principal_id = r.principal_id " $q = $q + " INNER JOIN [" + $db $q = $q + "].[sys].[database_principals] m" $q = $q + " ON j.member_principal_id = m.principal_id " $q = $q + " WHERE m.type = 'R' " # Proofing: Uncomment the following line to view the query created in the variable $q #$q | ft $SqlCmd.CommandText = $q $SqlCmd.Connection = $SqlConnection $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter $SqlAdapter.SelectCommand = $SqlCmd $DataSet = New-Object System.Data.DataSet $SqlAdapter.Fill($DataSet) $SqlConnection.Close() $DataSet.Tables[0] $DataSet | FOREACH-OBJECT { [string]$_.Name } #add the iDatabase object to the array of iDatabase objects $iDatabases += $iDatabase } }
I would like to insert the following information from the script in rows in a SQL Server table:
- SQL Server\Instance (Server1\SQL1) --same format from the text file
- Database Name
- Role Name
- Role Type
- Role Type Desc
- $currentDT
I've done this with other scripts (with help) but I can't see how to get the values from this one.
-Al H