【问题标题】:ASP.Net Membership.DeleteUserASP.Net Membership.DeleteUser
【发布时间】:2010-10-03 03:36:54
【问题描述】:

在测试中,我使用的数据库上的用户是个大杰夫。在生产中,他只有 Execute。

当我打电话时,

Membership.DeleteUser(user)

在测试中,它起作用了。 我在生产中尝试了同样的方法,我得到了这个:

DELETE 语句与 REFERENCE 约束冲突 “FK__aspnet_Us__UserI__37703C52”。数据库发生冲突 “测试”,表“dbo.aspnet_UsersInRoles”,列“UserId”。

在我的 seargles(在 Google 上搜索)中,我遇到了这个 link 老兄说的地方,

错误:DELETE 语句冲突 带有 REFERENCE 约束 “FK__aspnet_Me__UserI__15502E78”。这 数据库发生冲突 “您的数据库名称”,表 “dbo.aspnet_Membership”,列 '用户 ID'。

我花了一段时间才找到解决方案 跨多个站点和选项 作为错误和可能的解决方案 相当具有误导性。原来,在 至少在我的情况下,这是一个问题 具有会员权限 数据库。我使用的用户 连接有权查看 数据库中的成员详细信息 本身,但作为 aspnet_Users_DeleteUser 已存储 它从 系统对象表。会员资格 连接用户显然没有 有足够的权利这样做 选择所以整体删除失败。

对我来说,解决方法是将用户添加到 aspnet_Membership_FullAccess 角色 用于会员数据库。

但是当我这样做时它不起作用。有人对如何处理这个问题有任何想法吗?

【问题讨论】:

    标签: asp.net asp.net-membership database-permissions


    【解决方案1】:

    经过一番检查,我发现问题出在 aspnet_Users_DeleteUser 存储过程中的这一行:

    IF ((@TablesToDeleteFrom & 1) <> 0 AND
        (EXISTS (SELECT name FROM sysobjects WHERE (name = N'vw_aspnet_MembershipUsers') AND (type = 'V'))))
    

    另外 3 个表格还有 3 个类似的行。问题是,如果执行存储过程的用户无权访问 vw_aspnet_MembershipUsers,则在从 sysobjects 中选择时不会出现。我很想知道为什么整个 EXISTS 语句是必要的。

    不管怎样,下面的讨论“Access to sysobjects to view user tables without having access to the user tables directly in SQL Server Security”有答案。通过在相关视图上授予“VIEW DEFINITION”,EXISTS 语句现在将成功,您不必在应用程序的连接字符串中向用户授予不需要、不需要或过多的权限。

    【讨论】:

      【解决方案2】:

      我也遇到了这个问题,它是由缺少视图引起的,为了更正,我只是使用了另一个数据库中的创建脚本并重新创建了所有 vw_aspnet_* 视图。

      【讨论】:

        【解决方案3】:

        好吧,你猜怎么着?我读到这个: http://forums.asp.net/t/1254087.aspx

        好的,发送我的帖子几分钟后 我找到了解决方案:)事实证明 必须添加 SELECT PERMISSION 对于 ASPNET 用户 vw_aspnet_MembershipUsers 视图。

        但我为什么不这样做仍然是个谜 得到一个关于缺少的错误 允许。 EXIST 语句只是 返回 false。

        并授予生产用户 SELECT 权限,瞧! 有用! 谢谢大家!

        【讨论】:

        • 这没有意义。如果用户对存储过程 aspnet_Users_DeleteUser 具有执行权限,则视图上的 SELECT 权限无关紧要。就像对任何 aspnet 表拥有 DELETE 权限都没有关系一样。
        【解决方案4】:

        我相信您的“REFERENCE”约束实际上是数据库中存在于 aspnet_Users 表和 aspnet_UsersInRoles 表之间的外键。我认为您正在尝试的用户在两个表中都有它的 UserId,并且在您可以将其从 Users 表中删除之前,它也必须从 UsersInRoles 表中删除。

        您是否尝试过http://msdn.microsoft.com/en-us/library/system.web.security.roleprovider.removeusersfromroles.aspx 以确保从该用户中删除所有角色?您也可以通过检查数据库中这两个表的行来进行验证。

        【讨论】:

          【解决方案5】:

          如果在 vw_aspnet_MembershipUsers 上授予 ASP 用户 SELECT 后错误(或类似错误)仍然存在,您可能希望为其他一些 vw_aspnet_ 授予 SELECT ????意见也。尤其是“个人资料”和“UsersInRoles”。否则 - 由于某些原因,DeleteUser SP 在从这些视图中选择时会得到一个空结果,并拒绝首先从中删除现有条目。

          【讨论】:

            【解决方案6】:

            最好确保执行删除成员身份的用户具有正确的 ASP.NET Membership sql 角色。 在我的情况下,我正在删除一个具有一些角色和配置文件属性的会员用户。删除方法失败,但在分配了正确的 sql 角色后它起作用了。

            ALTER ROLE [aspnet_Profile_FullAccess] ADD MEMBER [<YOUR SQL USER>]
            ALTER ROLE [aspnet_Roles_FullAccess] ADD MEMBER [<YOUR SQL USER>]
            

            如果您正在使用该功能,还可以添加 [aspnet_Personalization_FullAccess]。

            【讨论】:

              【解决方案7】:

              我通过删除 proc 中检查视图的行来解决这个问题。我没有任何 asp 成员视图,并且在任何地方都不需要它们,所以创建视图似乎是毫无意义的,只是为了让代码行可以返回 true - proc 实际上并不使用视图。也许如果您使用成员资格对象的更多功能,您可能需要视图来做其他事情。无论哪种方式检查视图的存在对于 proc 来决定 aspnet_membership 表是否有需要删除的行似乎都是一种奇怪的方式。

              IF ((@TablesToDeleteFrom & 1) <> 0 
                  )
                  --AND
                  --   (EXISTS (SELECT name FROM sysobjects WHERE (name = N'vw_aspnet_MembershipUsers') AND (type = 'V'))))
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-07-23
                • 1970-01-01
                • 2012-07-07
                • 1970-01-01
                • 1970-01-01
                • 2014-05-27
                • 2016-05-17
                • 1970-01-01
                相关资源
                最近更新 更多