【问题标题】:The SELECT permission was denied on the object 'Address', database 'CNET_85731', schema 'dbo'对象“地址”、数据库“CNET_85731”、模式“dbo”的 SELECT 权限被拒绝
【发布时间】:2010-11-14 20:54:12
【问题描述】:

在过去的 7 个月里,我一直在使用 Visual Studio 2008 和 SQL Server 2008 开发 C# ASP.NET。

今天,我正在运行之前运行的应用程序的一部分,但出现以下错误:

对象“地址”、数据库“CNET_85731”、模式“dbo”的 SELECT 权限被拒绝。

我浏览了我的代码,发现这个错误是由以下用户控件引起的:

protected void sdsAddressesList_Selected(object sender, SqlDataSourceStatusEventArgs e)
{
    if (e.AffectedRows == 0)
    {
        ddlAddresses.Items.Insert((0), new ListItem("No Billing Addresses", "0"));
    }
}

SQLDataSource 定义如下:

<asp:SqlDataSource ID="sdsAddressesList" runat="server" OnSelecting="sdsAddressesList_Selecting" OnSelected="sdsAddressesList_Selected"
    SelectCommand="SELECT [AddressId], [ZipPostalCode], ZipPostalCode + '&nbsp;--&nbsp;' + Address1 AS CombinedAddress FROM [Address] WHERE ([CustomerID] = @CustomerID AND [IsBillingAddress] = @IsBillingAddress) ORDER BY [ZipPostalCode]"
    ConnectionString="<%$ ConnectionStrings:eCoSysConnection %>">
    <SelectParameters>
        <asp:Parameter Name="CustomerID" Type="Int32" />
        <asp:Parameter Name="IsBillingAddress" Type="Boolean" />
    </SelectParameters>
</asp:SqlDataSource>

基本上,控件的作用是从 [Address] 表中检索登录用户的地址列表,然后填充下拉列表 ddlAddresses。

Address 表与数据库中的其余表具有所有相同的权限。我有大约 60 个表和大约 200 个存储过程,它们都在愉快地进行 SELECT 等操作。没问题。除了这一个问题。到底是怎么回事?我没有对数据库或表权限进行任何更改。

谁能帮帮我。

问候

沃尔特

【问题讨论】:

  • 连接字符串是否指向正确的数据库(具有适当权限设置的数据库)?
  • 是的。 web.config 中的连接字符串如下: I始终使用相同的连接字符串访问数据库。
  • 与 sql server 绑定的 Windows 登录有什么变化吗?
  • 如果您以 SA 和/或该用户的身份通过管理工作室的某些用户登录 SQL 框并手动运行选择查询,会发生什么?
  • 并不是说我知道 shahkalpesh。所有其他数据库访问工作正常。

标签: c# sql-server-2008 asp.net-3.5


【解决方案1】:

如问题所述,“对象'地址'、数据库'CNET_85731'、模式'dbo'的SELECT权限被拒绝”。

我想知道你可以很简单地解决这个问题:

  • 打开 SQL Server 管理工作室
  • 导航到数据库“CNET_85731”>>安全>>用户
  • 右键单击您在代码中使用的那个
  • 最后,只需在“数据库角色成员资格”部分中选择“db_datareader”。

现在,我希望您不要再遇到此错误。

【讨论】:

  • 或者不选择'db_datareader'取消选中'db_denydatareader'
  • 谢谢。取消选中“db_denydatareader”和“db_denydatawriter”对我有用。
  • 不,这对我没有帮助。需要“授予用户选择权”,请查看 EPiddys 答案。
  • @CodingBarfield 谢谢。为什么 MS SQL 甚至有 deny 角色成员资格?对我来说就像一个巨魔。与不阅读就检查所有领域的人搞砸。 #有罪
【解决方案2】:

好吧,我不确定您的 db 用户拒绝 SELECT 权限的根本原因是什么,但如果您运行此程序,然后它确实再次工作,那么在某个地方,您的 SELECT 权限确实被清除了。

GRANT SELECT ON [dbo].[Address] TO [your user name here]

好消息是权限不会神奇地消失。坏消息是某些东西(无论是工具还是其他)确实删除或撤销了权限。

我认为我们没有足够的信息来回答您关于“为什么”发生的问题——尽管您发布的内容似乎都不是罪魁祸首。

【讨论】:

  • 嗨 EPiddy,是的,我同意,权限不会消失。我按照建议尝试了以下操作: GRANT SELECT ON [dbo].[Address] TO [POSITIVECODE-UW\ASPNET] 其中 'POSITIVECODE-UW\ASPNET' 是 ASPNET 帐户。该命令在 SQL Server 上成功完成,但不幸的是,我仍然收到相同的错误:对象“地址”、数据库“CNET_85731”、模式“dbo”的 SELECT 权限被拒绝。谢谢你的建议。问候沃尔特
  • 我什至尝试将 SELECT 命令放入存储过程并从 SqlDataSource 调用存储过程。没有。我只是拼命地抓住稻草。
【解决方案3】:

在您的 SQL Server Management Studio 中,右键单击您的数据库,然后单击权限,然后选择用户,然后授予选择、编辑、更新和删除权限。资源 http://go4answers.webhost4life.com/Example/select-permission-denied-object-159536.aspx

【讨论】:

    【解决方案4】:

    快速谷歌,找到了这个链接Link

    建议跑步

    select object_name(major_id) as object,
     user_name(grantee_principal_id) as grantee,
     user_name(grantor_principal_id) as grantor,
     permission_name,
     state_desc
    from sys.database_permissions
     where major_id = object_id('Users')
     and class = 1
    

    在您的数据库上查看存在哪些权限,因为您可能有一个 DENY 选择

    编辑

    select object_name(major_id) as object,
     user_name(grantee_principal_id) as grantee,
     user_name(grantor_principal_id) as grantor,
     permission_name,
     state_desc
    from sys.database_permissions
     WHERE state_desc = 'DENY'
    

    设法找到一个正在运行的 SQL 2k8 框,并运行它,这个新查询将显示所有拒绝。 也可以尝试去掉 WHERE 子句,查看当前选中数据库中所有表的所有权限

    【讨论】:

    • 感谢邮递员。我运行了这个查询,它返回了 0 行。我认为这是正确的?
    • 以下对象存在 DENY: sp_helpdiagrams sp_helpdiagramdefinition sp_creatediagram sp_renamediagram sp_alterdiagram sp_dropdiagram fn_diagramobjects
    • 没关系,这就是我所看到的。如果您删除 WHERE 子句,则有问题的表有哪些权限
    • 嗯,很奇怪,drop 和 create 也不起作用。如果您以用户身份登录到管理工作室,并运行“SELECT * FROM Address”,它肯定会返回行?我现在也在抓着稻草
    • 列出的对象都不是用户表。它们似乎都是系统对象。
    【解决方案5】:

    如果它在 SQL Server Management Studio 中出现该错误,那么只需以管理员身份运行 SQL Server Management Studio 即可。

    【讨论】:

      【解决方案6】:

      删除连接字符串的以下部分;

      集成安全=True;

      对我来说一切都很好。

      【讨论】:

        猜你喜欢
        • 2011-03-27
        • 1970-01-01
        • 2014-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-01
        相关资源
        最近更新 更多