MemberShip 删除用户存储过程

ALTER   PROCEDURE [dbo].aspnet_Users_DeleteUser  --删除用户信息
    @ApplicationName  NVARCHAR(256),
    
@UserName         NVARCHAR(256),
    
@TablesToDeleteFrom INT,
    
@NumTablesDeletedFrom INT OUTPUT
AS
/*因为用户的信息分开保存在多张表中,所以在删除某用户信息的 
  时候同时要在多张表中删除该用户的信息.所以下面才进行多个表的判断和操作.
  其中@TablesToDeleteFrom会接受由aspnet_Profile_DeleteProfiles传来的
  4,这个数用于对以下的于运算.这个存储过程还可能接受其他存储过程传过来的参数,不
   过目前我就看到这个. 
*/

BEGIN
    
DECLARE @UserId               UNIQUEIDENTIFIER
    
SELECT  @UserId               = NULL
    
SELECT  @NumTablesDeletedFrom = 0

    
DECLARE @TranStarted   BIT
    
SET @TranStarted = 0

    
IF@@TRANCOUNT = 0 )  --如果当前活动事务为0,开始事务并设置事务参数为1
    BEGIN
        
BEGIN TRANSACTION
        
SET @TranStarted = 1
    
END
    
ELSE
    
SET @TranStarted = 0

    
DECLARE @ErrorCode   INT  ---声明错误代码
    DECLARE @RowCount    INT   ---声明行数

    
SET @ErrorCode = 0
    
SET @RowCount  = 0

    
SELECT  @UserId = u.UserId
    
FROM    dbo.aspnet_Users u, dbo.aspnet_Applications a
    
WHERE   u.LoweredUserName       = LOWER(@UserName)
        
AND u.ApplicationId         = a.ApplicationId
        
AND LOWER(@ApplicationName= a.LoweredApplicationName
        
/*从aspnet_Users和aspnet_Applications表中查询输入的@UserName的UserId并
              付给声明的@UserId
*/



    
IF (@UserId IS NULL)  --如果此用户不存在,跳转到回滚
    BEGIN
        
GOTO Cleanup
    
END

    
-- Delete from Membership table if (@TablesToDeleteFrom & 1) is set
    IF ((@TablesToDeleteFrom & 1<> 0 AND
        (
EXISTS (SELECT name FROM sysobjects WHERE (name = N'aspnet_Membership'AND (type = 'U'))))
        
/* &(按位 AND)在两个整型值之间执行按位逻辑与运算。
             后面是判断是否存在aspnet_Membership表,直接运行后面这条语句的结果是aspnet_Membership
*/

        
/*即输入参数@TablesToDeleteFrom不为0且存在aspnet_Membership表的话,执行以下*/

    
BEGIN
        
DELETE FROM dbo.aspnet_Membership WHERE @UserId = UserId
         
---删除此用户的所有在aspnet_Membership表中的数据
        SELECT @ErrorCode = @@ERROR,
               
@RowCount = @@ROWCOUNT

        
IF@ErrorCode <> 0 ) --如果有错误则跳转到回滚
            GOTO Cleanup

        
IF (@RowCount <> 0--如果受影响行数不为0,即操作影响了数据行,表示操作成功
            SELECT  @NumTablesDeletedFrom = @NumTablesDeletedFrom + 1 --那个参数的值递增1
    END

    
-- Delete from aspnet_UsersInRoles table if (@TablesToDeleteFrom & 2) is set
    IF ((@TablesToDeleteFrom & 2<> 0  AND
        (
EXISTS (SELECT name FROM sysobjects WHERE (name = N'aspnet_UsersInRoles'AND (type = 'U'))) )
       
/*如果@TablesToDeleteFrom不为0且存在aspnet_UsersInRoles,执行以下*/

    
BEGIN
        
DELETE FROM dbo.aspnet_UsersInRoles WHERE @UserId = UserId
         
/*从aspnet_UsersInRoles表删除此用户的所有数据信息*/  
        

        
SELECT @ErrorCode = @@ERROR,
                
@RowCount = @@ROWCOUNT

        
IF@ErrorCode <> 0 ) --如果有错则回滚
            GOTO Cleanup

        
IF (@RowCount <> 0--如果操作成功为@NumTablesDeletedFrom递增1
            SELECT  @NumTablesDeletedFrom = @NumTablesDeletedFrom + 1
    
END

    
-- Delete from aspnet_Profile table if (@TablesToDeleteFrom & 4) is set
    IF ((@TablesToDeleteFrom & 4<> 0  AND
        (
EXISTS (SELECT name FROM sysobjects WHERE (name = N'aspnet_Profile'AND (type = 'U'))) )
          
/*如果@TablesToDeleteFrom不为0且存在aspnet_Profile,执行以下*/

    
BEGIN
        
DELETE FROM dbo.aspnet_Profile WHERE @UserId = UserId
          
/*从aspnet_Profile删除此用户的所有数据*/
        
SELECT @ErrorCode = @@ERROR,
                
@RowCount = @@ROWCOUNT

        
IF@ErrorCode <> 0 ) --有错误则回滚
            GOTO Cleanup

        
IF (@RowCount <> 0)  --成功则为@NumTablesDeletedFrom递增1
            SELECT  @NumTablesDeletedFrom = @NumTablesDeletedFrom + 1
    
END

    
-- Delete from aspnet_PersonalizationPerUser table if (@TablesToDeleteFrom & 8) is set
    IF ((@TablesToDeleteFrom & 8<> 0  AND
        (
EXISTS (SELECT name FROM sysobjects WHERE (name = N'aspnet_PersonalizationPerUser'AND (type = 'U'))) )
           
/*如果@TablesToDeleteFrom不为0且存在aspnet_PersonalizationPerUser,执行以下*/

    
BEGIN
        
DELETE FROM dbo.aspnet_PersonalizationPerUser WHERE @UserId = UserId
            
/*从aspnet_PersonalizationPerUser表删除此用户的所有数据信息*/  
        
SELECT @ErrorCode = @@ERROR,
                
@RowCount = @@ROWCOUNT

        
IF@ErrorCode <> 0 ) --有错误则跳转到回滚段
            GOTO Cleanup

        
IF (@RowCount <> 0)  --成功则为@NumTablesDeletedFrom的值递增1
            SELECT  @NumTablesDeletedFrom = @NumTablesDeletedFrom + 1
    
END

    
-- Delete from aspnet_Users table if (@TablesToDeleteFrom & 1,2,4 & 8) are all set
    IF ((@TablesToDeleteFrom & 1<> 0 AND
        (
@TablesToDeleteFrom & 2<> 0 AND
        (
@TablesToDeleteFrom & 4<> 0 AND
        (
@TablesToDeleteFrom & 8<> 0 AND
        (
EXISTS (SELECT UserId FROM dbo.aspnet_Users WHERE @UserId = UserId)))
       
/*如果全部按位于都不为0且aspnet_Users表中是否存在此用户
           其实1,2,4,8和1按位于都不为0
*/


    
BEGIN
        
DELETE FROM dbo.aspnet_Users WHERE @UserId = UserId
          
/*删除aspnet_Users中此用户的数据*/

        
SELECT @ErrorCode = @@ERROR,
                
@RowCount = @@ROWCOUNT

        
IF@ErrorCode <> 0 ) --有错误则跳转到回滚段
            GOTO Cleanup

        
IF (@RowCount <> 0)   --成功则为@NumTablesDeletedFrom值递增1
            SELECT  @NumTablesDeletedFrom = @NumTablesDeletedFrom + 1
    
END

    
IF@TranStarted = 1 ) --如果事务正常开始到这里
    BEGIN
        
SET @TranStarted = 0 --重新设置为0
        COMMIT TRANSACTION   --结束事务
    END

    
RETURN 0

Cleanup:  
---这就是传说中的跳转部分
    SET @NumTablesDeletedFrom = 0

    
IF@TranStarted = 1 )
    
BEGIN
        
SET @TranStarted = 0
        
ROLLBACK TRANSACTION
    
END

    
RETURN @ErrorCode

END


posted @ 2007-01-09 14:20  M'  阅读(727)  评论(0编辑  收藏  举报