9

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

当我打电话时,

Membership.DeleteUser(user)

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

DELETE 语句与 REFERENCE 约束“FK__aspnet_Us__UserI__37703C52”冲突。冲突发生在数据库“Testing”、表“dbo.aspnet_UsersInRoles”、列“UserId”中。

在我的 seargles(在 Google 上搜索)中,我遇到了这个家伙说的这个链接

错误:DELETE 语句与 REFERENCE 约束“FK__aspnet_Me__UserI__15502E78”冲突。冲突发生在数据库“YourDBName”、表“dbo.aspnet_Membership”、列“UserId”中。

我花了一段时间在多个站点和选项中找到解决方案,因为错误和可能的解决方案相当具有误导性。事实证明,至少在我的情况下,这是成员数据库权限的问题。我用来连接的用户有权查看数据库本身的成员详细信息,但作为 aspnet_Users_DeleteUser 存储过程的一部分,它从 sysobjects 表中选择。会员连接用户显然没有足够的权限来执行该选择,因此整体删除失败。

我的解决方法是将用户添加到成员数据库的 aspnet_Membership_FullAccess 角色。

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

4

7 回答 7

7

经过一番检查,我发现问题出在 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 语句是必要的。

无论如何,下面的讨论“访问 sysobjects 以查看用户表,而无需直接在 SQL Server 安全性中访问用户表”有答案。通过在相关视图上授予“VIEW DEFINITION”,EXISTS 语句现在将成功,您不必在应用程序的连接字符串中向用户授予不需要的、不需要的或过多的权限。

于 2010-07-08T14:40:00.477 回答
6

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

于 2009-04-28T17:03:54.343 回答
5

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

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

但是为什么我没有收到有关缺乏许可的错误仍然是个谜。EXIST 语句只是返回 false。

并授予生产用户 SELECT 权限,瞧!有用!多谢你们!

于 2009-01-23T19:14:37.570 回答
2

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

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

于 2009-01-23T14:36:18.910 回答
1

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

于 2009-04-09T10:04:14.300 回答
0

也许更好地确保执行删除成员身份的用户具有正确的 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]。

于 2016-06-01T07:16:17.347 回答
0

我通过删除 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'))))
于 2016-06-29T02:17:13.833 回答