Разрешения базы данных совпадают с теми, кто запускает скрипт 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?)

Другие вопросы по тегам