当我们的一个“超级用户”试图运行该程序时,VStudio 2008中用VB.Net编写的这个桌面应用程序失败了:
Select permission denied on object 'AcctLogon', database 'MDS', owner 'dbo'.
该应用程序的作者已经出了几个星期,而她在外出时我是“修理工”。我们的SQL登录都具有MDS数据库中db_owner的权限,但我们的用户没有。用户具有此SQL实例的Windows用户登录名。此登录仅在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中定义为一个连接字符串,其范围为“Application”,其值为:
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;集成安全性=真
我认为解释了如何使用登录用户的凭据(而不是使用我希望在“init”时间简单建立的应用程序角色并完成该问题)。
因此,总而言之,使用应用程序角色是否需要全局持久连接或其他一些超出我在此描述的技术?
答案 0 :(得分:0)
您是否检查过以确保用户在dbo或桌面上没有任何明确的拒绝?此外,用户的Windows登录是否映射到MDS数据库?