Это настольное приложение, написанное на VB.Net в VStudio 2008, перестало работать, когда один из наших «опытных пользователей» пытается запустить программу:
Select permission denied on object 'AcctLogon', database 'MDS', owner 'dbo'.
Автор приложения отсутствует в течение нескольких недель, и я "исправитель", пока она отсутствует. Оба наших логина для SQL имеют разрешения для db_owner в базе данных MDS, но наш пользователь не имеет. У пользователя есть логин пользователя Windows для этого экземпляра SQL. Этот логин имеет разрешения для публичной роли только в базе данных MDS.
Вместо того, чтобы просто дать логину пользователя такое же разрешение db_owner, я решил попробовать исправить программу, установив роль приложения для настольной программы. Когда я тестировал код, он, похоже, работал с помощью отладки, но после развертывания новой версии произошел сбой с тем же сообщением «отказано в доступе» для poweruser.
Вот что я сделал в VB.Net (этот саб называется в событии загрузки формы запуска):
Private Sub SetApplicationRole()
Try
Dim SQLConn As New SqlClient.SqlConnection
SQLConn.ConnectionString = GetConnStr
SQLConn.Open()
Dim SQLCmd As New SqlClient.SqlCommand
SQLCmd.CommandText = "Execute sp_setapprole AccountMaintenanceUtility, 'mypasswrd' "
SQLCmd.Connection = SQLConn
SQLCmd.ExecuteNonQuery()
Catch sex As SqlException
MsgBox(sex.ToString())
End Try
End Sub
'GetConnStr' - это строка свойства, которая определена в Settings.Settings как строка подключения с областью действия «Приложение», и ее значение:
Data Source=MDWDATA;Initial Catalog=MDS;Integrated Security=True
В SQL я запустил следующий скрипт:
use MDS
go
sp_addapprole 'AccountMaintenanceUtility', 'mypasswrd'
go
sp_addrolemember 'db_owner', 'AccountMaintenanceUtility'
Я не вижу, что я сделал неправильно или упустил из виду. Я надеюсь исправить это на каком-то «высоком уровне», не углубляясь в ее программу, и я не могу отладить Visual Studio на рабочем столе отказавшего пользователя.
E D I T - уточнение:
Насколько «постоянным» является настройка роли приложения? Я подозреваю, что это может быть причиной моего недопонимания по этому поводу. Как я уже говорил выше, когда приложение инициализируется, я ИСПОЛЬЗУЮ заданную роль приложения с данным соединением, которое имеет только локальную область действия внутри этой подпрограммы.
Теперь я смотрю на остальную часть ее кода, где она написала различные подпрограммы, чтобы «делать вещи», и они обычно характеризуются чем-то вроде:
Dim conn As SqlConnection = New SqlConnection(UserConnstr)
, где:
UserConnstr имеет значение:
Источник данных = MDWDATA; Исходный каталог = MDS; Интегрированная безопасность = True
, который, я думаю, объясняет, как используются учетные данные вошедшего в систему пользователя (вместо того, чтобы использовать роль приложения, которую я надеялся просто установить во время «инициализации» и решить эту проблему).
Итак, в целом, требует ли использование роли приложения глобально-постоянное соединение или какой-то другой метод, помимо того, что я здесь описал?