2009-01-23 13 views
8

Trong thử nghiệm, người dùng trên một db tôi đã sử dụng là một jefe lớn. Trong sản xuất, anh ta chỉ có Execute.ASP.Net Membership.DeleteUser

Khi tôi gọi,

Membership.DeleteUser(user) 

Trong thử nghiệm, nó làm việc. tôi cố gắng như nhau trong sản xuất, và tôi có được điều này:

The DELETE statement conflicted with the REFERENCE constraint "FK__aspnet_Us__UserI__37703C52". The conflict occurred in database "Testing", table "dbo.aspnet_UsersInRoles", column 'UserId'.

Trong seargles của tôi (tìm kiếm trên Google), tôi tình cờ gặp link này nơi anh chàng đang nói,

Error: The DELETE statement conflicted with the REFERENCE constraint "FK__aspnet_Me__UserI__15502E78". The conflict occurred in database "YourDBName", table "dbo.aspnet_Membership", column 'UserId'.

Took me a while to find a solution to this across multiple sites and options as the error and possible solutions were rather misleading. Turns out, at least in my case, it was a problem with permissions on the membership database. The user I'm using to connect had access to view the membership details within the database itself, but as part of the aspnet_Users_DeleteUser stored procedure it selects from the sysobjects table. The membership connection user apparently did not have sufficient rights to do that select so the overall delete failed.

The fix for me was to add the user to the aspnet_Membership_FullAccess role for the membership database.

Nhưng khi Tôi đã làm điều đó không hiệu quả. Bất cứ ai có bất kỳ ý tưởng về làm thế nào để đối phó với điều này?

Trả lời

7

Sau một kiểm tra nhỏ, tôi thấy vấn đề là dòng này trong thủ tục lưu trữ aspnet_Users_DeleteUser:

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

Có 3 dòng tương tự khác cho 3 bảng khác. Vấn đề là nếu người dùng thực hiện proc được lưu trữ không có quyền truy cập vào vw_aspnet_MembershipUsers nó sẽ không bật lên khi chọn từ sysobjects. Tôi tò mò muốn biết tại sao toàn bộ câu lệnh EXISTS đó là cần thiết.

Bất kể, cuộc thảo luận sau, "Access to sysobjects to view user tables without having access to the user tables directly in SQL Server Security", có câu trả lời. Bằng cách cấp "VIEW DEFINITION" cho các chế độ xem đang được đề cập, các câu lệnh EXISTS bây giờ sẽ thành công và bạn không phải cấp quyền không cần thiết, không mong muốn hoặc quá mức cho người dùng trong chuỗi kết nối của ứng dụng của bạn.

2

Tôi tin rằng ràng buộc 'REFERENCE' của bạn thực sự là khóa ngoại trong cơ sở dữ liệu tồn tại giữa bảng aspnet_Users và bảng aspnet_UsersInRoles. Tôi sẽ chỉ ra rằng người dùng bạn đang cố gắng, có UserId trong cả hai bảng và trước khi bạn có thể loại bỏ nó khỏi bảng Users, nó cũng phải được loại bỏ khỏi bảng UsersInRoles.

Bạn đã thử http://msdn.microsoft.com/en-us/library/system.web.security.roleprovider.removeusersfromroles.aspx để đảm bảo rằng tất cả các vai trò đều bị xóa khỏi người dùng này? Bạn cũng có thể xác minh bằng cách kiểm tra các hàng của hai bảng này trong cơ sở dữ liệu.

4

OK, hãy đoán xem? Tôi đọc này: http://forums.asp.net/t/1254087.aspx

Ok, few minutes after sending my post I found the solution :) It turns out that SELECT PERMISSION had to be added for ASPNET user on vw_aspnet_MembershipUsers view.

But it is still mystery why I didn’t get an error concerning lack of permission. EXIST statement was just returning false.

và đưa người dùng sản xuất CHỌN phép và thì đấy! Nó hoạt động! Xin cảm ơn các bạn!

+0

Điều này không có ý nghĩa .. Nếu người dùng có quyền thực thi trên thủ tục được lưu trữ aspnet_Users_DeleteUser, quyền SELECT trên chế độ xem không quan trọng. Cũng giống như có quyền DELETE trên bất kỳ bảng aspnet nào không quan trọng. – Matt

1

Nếu lỗi (hoặc tương tự) vẫn còn sau khi cấp người dùng ASP SELECT trên vw_aspnet_MembershipUsers, bạn có thể muốn cấp SELECT cho một số vw_aspnet khác _ ???? cũng vậy. Đặc biệt là "hồ sơ" và "UsersInRoles". Nếu không - vì một số lý do, SP của DeleteUser nhận được kết quả trống khi CHỌN từ các chế độ xem đó và từ chối xóa các mục nhập hiện có khỏi chúng trước.

5

Tôi cũng gặp sự cố này và do quan điểm bị thiếu, để sửa tôi chỉ sử dụng tập lệnh tạo từ cơ sở dữ liệu khác và tạo lại tất cả các khung nhìn vw_aspnet_ *.

0

Có thể tốt hơn để đảm bảo người dùng thực thi thành viên xóa có vai trò chính xác của tư cách thành viên ASP.NET. Trong trường hợp của tôi, tôi đã xóa một thành viên có một số vai trò và thuộc tính hồ sơ.Phương thức xóa không thành công, nhưng sau khi gán vai trò sql chính xác, nó đã hoạt động.

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

Bạn cũng có thể thêm [aspnet_Personalization_FullAccess] nếu bạn đang sử dụng chức năng đó.

0

Tôi đã giải quyết vấn đề này bằng cách xóa dòng trong proc để kiểm tra chế độ xem. Tôi không có bất kỳ quan điểm thành viên asp và không cần chúng bất cứ nơi nào, vì vậy nó có vẻ khá vô nghĩa để tạo ra quan điểm chỉ để dòng mã có thể trở lại đúng - proc không thực sự sử dụng xem. Có lẽ nếu bạn sử dụng nhiều tính năng hơn của các đối tượng thành viên, bạn có thể cần chế độ xem cho một số thứ khác. Dù bằng cách nào để kiểm tra sự tồn tại của khung nhìn có vẻ là một cách kỳ lạ để proc quyết định xem bảng aspnet_membership có một hàng cần xóa hay không.

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