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

时间:2009-07-28 21:18:40

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

我使用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"));
    }
}

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个存储过程都快乐地做SELECTs等工作。没问题。除了这一个问题。到底是怎么回事?我没有对数据库或表权限进行任何更改。

任何人都可以帮助我。

此致

沃尔特

6 个答案:

答案 0 :(得分:61)

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

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

  • 打开SQL Server Management studio
  • 导航至数据库'CNET_85731'&gt;&gt;安全&gt;&gt;用户
  • 右键单击您在代码中使用的那个
  • 最后,只需在“数据库角色成员资格”部分中选择“ db_datareader ”。

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

答案 1 :(得分:14)

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

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

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:3)

快速谷歌,发现此链接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框并运行它,这个新查询将显示所有deny的。 还要尝试取出WHERE子句,以查看当前所选数据库中所有表的所有权限

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

  

在tegrated Security = True;

一切都适合我。