Разрешения базы данных совпадают с теми, кто запускает скрипт PowerShell, вместо тех, которые указаны в строке подключения
Я хочу, чтобы разрешения SQL Server соответствовали идентификатору, указанному в строке подключения, а не тем, кто запускает скрипт PowerShell (обычно это я).
Например, у меня есть таблица с именем "MyTable", которую я могу обновить, но которую "TestIDRestricted" не может.
Я вхожу в Microsoft SQL Server Management Studio как "TestIDRestricted" и запускаю следующий запрос
select MyField
from MyTable
where ID = 2
и я вижу, что возвращается "4". Я сейчас пытаюсь обновить:
update MyTable
set MyField = 5
where ID = 2
Как и ожидалось, я получаю следующий результат ошибки:
Msg 229, Level 14, State 5, Line 1
The UPDATE permission was denied on the object 'MyTable', database 'mydb', schema 'dbo'.
Затем я запускаю следующий скрипт PowerShell UpdateProblem.ps1:
$ConnectionString = "Server=MyServer\MSSQL2012;Database=mydb;User Id= TestIDRestricted;Password=secretpasswd;"
$ConnectionString = $ConnectionString + "Trusted_Connection = yes;Persist Security Info=False"
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = $ConnectionString
$sqlConnection.Open()
$sqlCommand = $sqlConnection.CreateCommand()
$updateSQL ="update MyTable set MyField = 5 where ID = 2"
$sqlCommand.CommandText = $updateSQL
write-host $updateSQL
#following command should fail
$sqlCommand.ExecuteNonQuery()
$sqlConnection.close()
Я ожидаю, что это обновление завершится ошибкой, потому что я НЕ определяю интегрированную безопасность в строке подключения. Но когда я возвращаюсь в Microsoft SQL Server Management Studio как "TestIDRestricted" и снова запускаю следующий запрос
select MyField
from MyTable
where ID = 2
Я вижу, это возвращает "5". Таким образом, обновление прошло успешно, хотя я ожидаю, что оно не получится. Из того, что я могу сказать, причина, по которой это удалось, заключается в том, что разрешения SQL основаны на моем идентификаторе, использующем встроенную защиту вместо защиты, связанной с идентификатором, который я использую в строке подключения.
Как я могу заставить скрипт использовать разрешения, связанные с идентификатором, который я указываю в строке подключения, вместо использования разрешений моего идентификатора, которые, как представляется, сопровождают интегрированную защиту?
2 ответа
Вы устанавливаете Trusted_Connection в TRUE; это почти наверняка означает, что вы подключаетесь с учетными данными текущего пользователя, а не с данными, указанными в строке подключения. Пытаться:
$ConnectionString = "Server=MyServer\MSSQL2012;Database=mydb;User Id= TestIDRestricted;Password=secretpasswd;"
$ConnectionString = $ConnectionString + "Trusted_Connection = no;Persist Security Info=False"
Вы могли бы просто закомментировать вторую строку:
$ConnectionString = "Server=MyServer\MSSQL2012;Database=mydb;User Id= TestIDRestricted;Password=secretpasswd;"
' $ConnectionString = $ConnectionString + "Trusted_Connection = yes;Persist Security Info=False"
(Это VB?)