У меня есть SQL-запрос, который пропатчен Go
, чтобы проверить потерянные объекты в mssql.
use DBName
go
sp_change_users_login 'report'
Теперь я автоматизирую все вышеперечисленное в Powershell для всех пользовательских баз данных и пытаюсь получить пользователей-сирот.
Вот код:
if($port)
{
$connectionString ="server=$servername,$port;Integrated Security=true;" #uid=$DBUserName; pwd=$dbpwd;Database=$DB;
}
else
{
$connectionString ="server=$servername;Integrated Security=true;"
}
$connection = New-Object System.Data.SqlClient.SqlConnection -ea Stop
$connection.ConnectionString=$connectionString
$connection.Open()
$db_query = @"
Select name from sys.sysdatabases where dbid > 4 and name not in ('ReportServer')
"@
$command = $connection.CreateCommand()
$command.CommandText = $db_query
$result = $command.ExecuteReader()
$object= New-Object System.Data.DataTable
$object.Load($result)
[System.Array]$DBs = $object.name
if($DBs -is [System.Array])
{
foreach($DB in $DBs)
{
## PROBLEM IS HERE ###
$orphan_users_query = @"
use $DB
GO
sp_change_users_login 'report'
"@
$command = $connection.CreateCommand()
$command.CommandText = $orphan_users_query
$result = $command.ExecuteReader()
$object= New-Object System.Data.DataTable
$object.Load($result)
$object | Out-File C:\temp\outfile_property.txt -Append -Force
}
}
Проблема в том, что PS не может определить разделитель go
, поскольку он специфичен для MSSQL / SSMS. Итак, как мне по-прежнему выполнять итерацию и запускать запрос во всех пользовательских базах данных, не создавая несколько соединений, специфичных для каждой БД?