ALTERPROCEDURE dbo.aspnet_Roles_DeleteRole @ApplicationNameNVARCHAR(256), @RoleNameNVARCHAR(256), @DeleteOnlyIfRoleIsEmptyBIT--只有当角色为空时删除(即无用户使用该角色,下面有用) AS BEGIN DECLARE@ApplicationIdUNIQUEIDENTIFIER SELECT@ApplicationId=NULL SELECT@ApplicationId= ApplicationId FROM aspnet_Applications WHERELOWER(@ApplicationName) = LoweredApplicationName IF (@ApplicationIdISNULL) RETURN(1) /**//*查询@ApplicationId(他好象都是通过这个和另外一个调用存储过程的方法来返回@ApplicationId的 两种方法在我看来好象是一样的样子,不过存储过程显然验证的东西多点.)*/ DECLARE@ErrorCodeINT SET@ErrorCode=0 DECLARE@TranStartedBIT SET@TranStarted=0 IF( @@TRANCOUNT=0 ) ---如果当前活动事务为0,开始事务并设置事务参数为1 BEGIN BEGINTRANSACTION SET@TranStarted=1 END ELSE SET@TranStarted=0 DECLARE@RoleIdUNIQUEIDENTIFIER SELECT@RoleId=NULL SELECT@RoleId= RoleId FROM dbo.aspnet_Roles WHERE LoweredRoleName =LOWER(@RoleName) AND ApplicationId =@ApplicationId --声明角色ID并查询此角色的角色ID IF (@RoleIdISNULL) ---如果不存在 BEGIN SELECT@ErrorCode=1--返回错误 GOTO Cleanup END IF (@DeleteOnlyIfRoleIsEmpty<>0) --如果@DeleteOnlyIfRoleIsEmpty不为0 BEGIN IF (EXISTS (SELECT RoleId FROM dbo.aspnet_UsersInRoles WHERE@RoleId= RoleId)) /**//*如果存在有用户在使用此角色,就是这意思吧.*/ BEGIN SELECT@ErrorCode=2--返回错误代码2 GOTO Cleanup END END DELETEFROM dbo.aspnet_UsersInRoles WHERE@RoleId= RoleId /**//*从aspnet_UsersInRoles表中删除此角色的所有记录*/ IF( @@ERROR<>0 ) --如果有错误,返回错误代码并跳转到回滚 BEGIN SET@ErrorCode=-1 GOTO Cleanup END DELETEFROM dbo.aspnet_Roles WHERE@RoleId= RoleId AND ApplicationId =@ApplicationId /**//*从aspnet_Roles中删除此角色*/ IF( @@ERROR<>0 ) ---如果有错误则回滚 BEGIN SET@ErrorCode=-1 GOTO Cleanup END IF( @TranStarted=1 ) BEGIN SET@TranStarted=0 COMMITTRANSACTION END RETURN(0) /**//*因为角色在两个表中存在,所以删除某角色的时候必须删除两个表中的信息*/ Cleanup: IF( @TranStarted=1 ) BEGIN SET@TranStarted=0 ROLLBACKTRANSACTION END RETURN@ErrorCode END