【问题标题】:SQL - Another "SELECT Permission was denied on the object" IssueSQL - 另一个“对象的 SELECT 权限被拒绝”问题
【发布时间】:2014-08-16 14:52:57
【问题描述】:

(我知道 SO 有十多个标题相同/相似的问题,我保证我已经通过每一个问题都无济于事。我可能错过了一两个小细节,但我怀疑我的问题可能是根深蒂固的东西。足够的介绍)

​​>

无论如何,我有一个从备份数据库恢复的数据库(我们称之为FooDB)。我可以使用 SQL Server 2012 Management Studio 做任何我想做的事情,包括在任何记录、列或表上的 SELECTINSERTDELETE

我遇到的问题是,当我尝试对同一个数据库运行一个简单查询时,我收到以下错误:

发生错误。","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 登录名并打开“属性”对话框 -> 在“服务器角色”页面中,我选择了dbcreatorpublicserveradminsetupadminsysadmin

  • 在上面的同一个“属性”对话框中,我选择了“用户映射”页面,然后选中了数据库 (FooDB) 的“映射”复选框,并分配了以下数据库角色成员资格:db_accessadmindb_backupoperatordb_datareaderdb_datawriterdb_ddladmindb_ownerdb_securityadminpublic

  • 从 Server Management Studio 的对象资源管理器中,我选择了 'Databases' -> 'FooDB' -> 'Security' -> 'Users' -> 然后我右键单击 Windows 登录名并选择了 '属性”以打开“数据库用户”对话框。然后我选择了“Owned Schemas”页面并检查了db_backupoperatordb_datareaderdb_datawriter

  • 1234563 @

这就是我此刻所能想到的。同样,在 SQL Server Management Studio 中(使用相同的 Windows 身份验证和服务器名称登录后),我可以对数据库做任何我想做的事情。但是在我的 C# 类中,我似乎可以连接到数据库,但我没有执行任何操作的权限。

这是我近一周来一直在努力解决的问题,但没有成功。是什么赋予了?

【问题讨论】:

    标签: sql sql-server database permissions


    【解决方案1】:

    服务器身份验证是否设置为 SQL Server 和 Windows 身份验证模式? 为此,请右键单击 SQLServer -> 属性 -> 安全性。

    编辑:Dint 表示数据库,确实表示 SqlServer

    【讨论】:

    • 我右键单击我的数据库 (FooDB) -> 属性 -> 单击“查看连接属性”,对话框显示身份验证方法确实是 Windows 身份验证。 (编辑:啊,有一个不同的链接显示“查看服务器权限” - 它有“安全”页面,其中服务器身份验证方法已检查“SQL 服务器和 Windows 身份验证”。
    【解决方案2】:

    您是否尝试过运行 sp_change_users_login 。

    有时当您恢复数据库时,它会为用户创建新的 sid(安全 ID)。当它这样做时,数据库用户和服务器登录看起来相同,但内部 sid 不匹配。 sp_change_users_login 会解决这个问题。

    关于如何使用存储过程的详细信息可以在这里找到:

    https://msdn.microsoft.com/en-us/library/ms174378.aspx

    最初尝试一下 - 您必须稍微修改一下以适合您的用户名和登录名:

    EXEC sp_change_users_login 'update_one', 'YourDBUserName', 'YourServerLoginName';

    【讨论】:

      猜你喜欢
      • 2010-09-25
      • 1970-01-01
      • 2020-07-03
      • 2011-01-01
      • 2015-01-28
      • 2015-05-24
      • 2021-08-30
      • 1970-01-01
      • 2011-07-11
      相关资源
      最近更新 更多