在测试中,我使用的db上的用户是一个很大的jefe。在制作中,他只有执行。
当我打电话时,
Membership.DeleteUser(user)
在测试中,它起作用了。 我在制作中尝试相同,我得到了这个:
DELETE语句与REFERENCE约束冲突 “FK__aspnet_Us__UserI__37703C52”。冲突发生在数据库中 “测试”,表“dbo.aspnet_UsersInRoles”,列'UserId'。
在我的搜索中(在Google上搜索),我遇到了link 老兄在说什么,
错误:DELETE语句发生冲突 使用REFERENCE约束 “FK__aspnet_Me__UserI__15502E78”。该 数据库中发生冲突 “YourDBName”,表格 专栏“dbo.aspnet_Membership” '用户ID'。
花了一些时间才找到解决办法 跨多个站点和选项 作为错误和可能的解决方案 相当误导。原来,在 至少在我的情况下,这是一个问题 拥有会员资格的权限 数据库。我正在使用的用户 connect有权查看 数据库中的成员详细信息 本身,但作为一部分 存储了aspnet_Users_DeleteUser 它从中选择的程序 sysobjects表。会员资格 连接用户显然没有 有足够的权利这样做 选择,以便整体删除失败。
我的修复是将用户添加到 aspnet_Membership_FullAccess角色 对于会员数据库。
但是当我这样做时它没有用。任何人对如何处理这个都有任何想法吗?
答案 0 :(得分: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陈述是必要的。
无论如何,以下讨论“Access to sysobjects to view user tables without having access to the user tables directly in SQL Server Security”都有答案。通过在相关视图上授予“查看定义”,EXISTS语句现在将成功,您不必在应用程序的连接字符串中向用户授予不必要的,不需要的或过多的权限。
答案 1 :(得分:5)
我也有这个问题,它是由于缺少视图引起的,为了纠正我只是使用了来自另一个数据库的创建脚本并重新创建了所有vw_aspnet_ *视图。
答案 2 :(得分:4)
好的,你猜怎么着?我看了这个: http://forums.asp.net/t/1254087.aspx
好的,发送我的帖子几分钟后 我发现了解决方案:)事实证明 必须添加SELECT PERMISSION 对于ASPNET用户 vw_aspnet_MembershipUsers视图。
但为什么我不这样做仍然是个谜 得到一个关于缺乏的错误 允许。 EXIST声明只是 返回假。
并授予生产用户SELECT权限,瞧! 有用! 谢谢你们!
答案 3 :(得分:2)
我相信你的'REFERENCE'约束实际上是aspnet_Users表和aspnet_UsersInRoles表之间存在的数据库中的外键。我想你正在尝试的用户,在两个表中都有UserId,在你从Users表中删除它之前,它也必须从UsersInRoles表中删除。
您是否尝试过http://msdn.microsoft.com/en-us/library/system.web.security.roleprovider.removeusersfromroles.aspx以确保从该用户中删除了所有角色?您也可以通过检查数据库中这两个表的行来验证。
答案 4 :(得分:1)
如果在vw_aspnet_MembershipUsers上授予ASP用户SELECT后错误(或类似)仍然存在,您可能想要为其他一些vw_aspnet _ ????授予SELECT。观点也是。特别是“个人资料”和“UsersInRoles”。否则 - 由于某些原因,当从这些视图中选择SELECT并从而拒绝从中删除现有条目时,DeleteUser SP将获得空结果。
答案 5 :(得分:0)
或许最好确保执行删除成员资格的用户具有更正ASP.NET成员资格的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]。
答案 6 :(得分: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'))))