确保唯一的用户名

时间:2012-04-17 17:50:28

标签: asp.net sql tsql asp.net-membership

Asp.net会员2.0。

我想更新表aspnet_user中的用户名,最好的方法是直接更新表。

UPDATE aspnet_Users SET UserName = @UserName,LoweredUserName = LOWER( @UserName) 
WHERE UserName = @CurrentUname 

如何确保它是独一无二的?

谢谢,

更新: If not exist (select UserName from aspnet_Users) Begin UPDATE aspnet_Users SET UserName = @UserName,LoweredUserName = LOWER( @UserName)
WHERE UserName = @CurrentUname
End

如何修改上面的代码?

第二次更新:

If not exist (select UserName from aspnet_Users WHERE UserName = @CurrentUname)
Begin 
  UPDATE aspnet_Users SET UserName = @UserName,LoweredUserName = LOWER( @UserName)
WHERE UserName = @CurrentUname
End
SELECT 1;
else
select 0;

3 个答案:

答案 0 :(得分:4)

在用户名栏上创建一个唯一索引。

类似的东西:

CREATE UNIQUE INDEX index_username
ON aspnet_Users (UserName)

答案 1 :(得分:3)

在数据库中的列上放置一个唯一约束。然后在尝试更新之前检查现有用户名,或者捕获异常并相应地处理它。

答案 2 :(得分:1)

除了@Icarus和@Pete M回复。这些已经是好的/可信的建议。

替代方案是,您可以使用 TransactionScope 吗?

伪代码

using (TransactionScope scope = new TransactionScope())
{
    UPDATE aspnet_Users 
    SET    UserName = @UserName,
           LoweredUserName = LOWER( @UserName) 
    WHERE  UserName = @CurrentUname

    if((select count(userName) 
        From   aspnet_Users
        Where  userName = @CurrentUname) = 1)
    Begin
         scope.Complete
    End
}

上述方法将独立session of the request保留在Transaction下,并将其isolated与其他用户提出的其他请求保持一致。