У меня есть 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. Итак, как я могу выполнять итерацию и выполнять запрос во всех пользовательских базах данных, не создавая несколько соединений, специфичных для каждой БД?
Вызов ChangeDatabase
для соединения является альтернативным способом переключения баз данных.
Затем вы можете просто выполнить sp_change_users_login
как есть. Не надо GO
.
@RanadipDutta - я не понимаю возражений. Буквально просто $connection.ChangeDatabase($DB)
.
Проблема в том, что владелец продукта пытается этого избежать :P. Ничего больше. В любом случае, я приму этот ответ, потому что он имеет смысл.
К сожалению, я действительно хочу избежать изменения БД с помощью строки подключения и хочу обрабатывать ее в запросах sql. Есть ли другие средства для прогресса? Если изменение БД обрабатывается, то я могу полностью игнорировать Go, как вы заявили.