(我知道SO有十几个问题,有相同/相似的标题,我保证我已经完成了每一个都无济于事。我可能错过了一两个小细节,但我怀疑我的问题可能是更根深蒂固的东西。足以说明介绍)
无论如何,我有一个从备份数据库恢复的数据库(让我们称之为FooDB
)。我可以使用SQL Server 2012 Management Studio执行任何操作,包括任何记录,列或表的SELECT
,INSERT
或DELETE
。
我遇到的问题是,当我尝试对同一个数据库运行简单查询时,出现以下错误:
发生了错误。“,”ExceptionMessage“:”对象'BarTable',数据库'FooDB',架构'dbo'上的SELECT权限被拒绝。“
堆栈跟踪还有很多,但除非必要,否则我不会在此处发布。我正在使用Visual Studio 2012 Ultimate,并在其中一个类文件中指定了连接字符串,如下所示:
using (SqlConnection con = new SqlConnection("Data Source=.\\SQLEXPRESS;" +
"Initial Catalog=FooDB;" +
"Integrated Security=true;"))
{
con.Open();
using (SqlCommand command = new SqlCommand("SELECT TOP 3 * FROM BarTable", con))
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
... // code in this block is not shown as it is irrelevant to the issue
}
}
}
听到我在SO上遇到的各种建议,我尝试了以下内容:
在SQL Server Management Studio中,我选择了“安全” - > '登录' - >右键单击Windows登录名,然后打开“属性”对话框 - >在“服务器角色”页面中,我选择了dbcreator
,public
,serveradmin
,setupadmin
和sysadmin
在上面的“属性”对话框中,我选择了“用户映射”页面,然后选中了数据库(FooDB)的“映射”复选框,并分配了以下数据库角色成员资格:{{1 }},db_accessadmin
,db_backupoperator
,db_datareader
,db_datawriter
,db_ddladmin
,db_owner
和db_securityadmin
从Server Management Studio的对象资源管理器中,我选择了“数据库” - > 'FooDB' - > '安全' - > '用户' - >然后我右键单击Windows登录名并选择“属性”以打开“数据库用户”对话框。然后,我选择了“拥有架构”页面并选中public
,db_backupoperator
和db_datareader
在上面的同一个对话框中,我选择了“会员资格”页面,然后选中了db_datawriter
,db_accessadmin
,db_backupoperator
,db_datareader
,{{1 }},db_datawriter
和db_ddladmin
这就是我现在所能想到的。同样,在SQL Server Management Studio中(使用相同的Windows身份验证和服务器名称登录后),我可以对数据库执行任何操作。但是从我的C#类中,似乎我可以连接到数据库,但我没有权限执行任何操作。
这是近一周来我一直在努力的失败。是什么赋予了?
答案 0 :(得分:0)
服务器身份验证是否设置为SQL Server和Windows身份验证模式? 为此,右键单击SQLServer - >属性 - >安全
编辑:Dint意味着数据库,确实意味着SqlServer
答案 1 :(得分:0)
您是否尝试过运行sp_change_users_login。
有时,当您还原数据库时,它会为用户创建新的sid(安全ID)。当它这样做时,数据库用户和服务器登录看起来相同,但内部的sids不匹配。 sp_change_users_login将解决这个问题。
有关如何使用存储过程的详细信息,请访问:
https://msdn.microsoft.com/en-us/library/ms174378.aspx
最初尝试此操作 - 您必须稍微编辑它以适合您的用户和登录名:
EXEC sp_change_users_login'update_one','YourDBUserName','YourServerLoginName';