Как устранить неполадки, связанные с ролью приложения SQL Server, не работающей в приложении VB.Net - PullRequest
0 голосов
/ 08 октября 2009

Это настольное приложение, написанное на 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

, который, я думаю, объясняет, как используются учетные данные вошедшего в систему пользователя (вместо того, чтобы использовать роль приложения, которую я надеялся просто установить во время «инициализации» и решить эту проблему).

Итак, в целом, требует ли использование роли приложения глобально-постоянное соединение или какой-то другой метод, помимо того, что я здесь описал?

1 Ответ

0 голосов
/ 08 октября 2009

Вы проверили, чтобы убедиться, что у пользователя нет явных запретов на dbo или таблицу?Кроме того, сопоставлено ли имя пользователя Windows с базой данных MDS?

...