【问题标题】:Ensure unique username确保唯一的用户名
【发布时间】:2012-04-17 17:50:27
【问题描述】:

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;

【问题讨论】:

  • 这真的是最好的更新方式吗?您是否只需要查询表以查看是否已经存在具有该名称的用户 - 如果您可以为更新编写查询,您不能为此编写一个 SELECT 查询吗?
  • 如果新用户名已经存在,我想阻止它。
  • @pst 这可能是 ASP.NET SqlMembershipProvider 的表 - 我会担心这样做,因为默认代码可能无法优雅地处理唯一性异常
  • if not exist() 中也需要 WHERE UserName = @UserName。但是,如果您在 SQL 中进行检查,您还需要从此 sn-p 返回成功/失败。

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


【解决方案1】:

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

类似:

CREATE UNIQUE INDEX index_username
ON aspnet_Users (UserName)

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 如果进行预检查,使用适当的事务很重要。
    • 不,是 ASP.NET SqlMembershipProvider 的表。我不想这样。
    • 好点。在检查预先存在的名称和尝试为第一个用户进行更新之间,不能保证第二个用户不会使用所需的名称。表约束仍然会强制解决问题并向您大喊大叫,但这比将整个事情作为原子事务执行要麻烦得多。
    • 我不明白你为什么不想添加约束,因为它是一个 SqlMembershipProvider 表。如果你想绝对保证唯一性,约束是唯一明智的方法。总有触发路线。光是提到它就让我觉得很肮脏......这里的整个故事是什么?你为什么做这个?也许您应该考虑推出自己的提供商?
    【解决方案3】:

    除了@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不受其他用户的其他请求。

    【讨论】:

    • 它似乎是不同的和启发。能否请您添加整个代码?
    • 我添加了伪代码。这只是我的观点。我希望你能把它转换成实际的代码。
    • 我猜应该是scope.Complete()而不是Trans.Complete();
    • 请注意,这是您不想使用Unique Constraint的情况。
    • @Love,使用这种技术的主要优点是TransactionScope 可以跨越multiple resources (i.e. multiple databases, or a database and an MSMQ server, etc).
    猜你喜欢
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 2015-05-17
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多