对象'地址',数据库'CNET_85731',架构'dbo'上的SELECT权限被拒绝

Wal*_*art 23 c# asp.net-3.5 sql-server-2008

我使用Visual Studio 2008和SQL Server 2008在C#ASP.NET上工作了7个月.

今天,我正在运行以前运行的应用程序的一部分,我收到以下错误:

对象'地址',数据库'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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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

Address表具有与数据库中其余表相同的权限.我有大约60个表和大约200个存储过程都快乐地做SELECTs等工作.没问题.除了这一个问题.到底是怎么回事?我没有对数据库或表权限进行任何更改.

任何人都可以帮助我.

问候

沃尔特

san*_*ula 61

正如问题所述,"对象'地址',数据库'CNET_85731',架构'dbo'"拒绝了SELECT权限.

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

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

现在,我希望你不要再犯这个错误.

  • 或者不是选择'db_datareader'uncheck'db_denydatareader' (7认同)
  • 谢谢.取消选中'db_denydatareader'和'db_denydatawriter'对我有用. (5认同)

小智 14

好吧,我不确定你的数据库用户拒绝SELECT权限的根本原因是什么,但是如果你运行它然后它确实再次工作,那么在某个地方,你的SELECT权限确实被删除了.

GRANT SELECT ON [dbo].[Address] TO [your user name here]
Run Code Online (Sandbox Code Playgroud)

好消息是权限不会神奇地消失; 坏消息是(工具或其他方面)确实要么删除或撤销权限.

我认为我们没有足够的信息来回答你关于"为什么"它发生的问题 - 尽管你发布的内容似乎都不是罪魁祸首.