【问题标题】:DisplayName - 'User' + UserId - Best Way to Do ThisDisplayName - '用户' + UserId - 最好的方法
【发布时间】:2011-05-02 20:39:51
【问题描述】:

我想做一些类似于 SO 对 DisplayName 所做的事情。当有人没有输入 DisplayName 时,我想将其默认为 'User' + UserId。所以第一个注册的用户会得到User1——因为UserId是1,第二个User2——因为UserId是2,以此类推。

我能想到的最简单的方法是使用触发器,但我不喜欢触发器。我可以保存用户,然后在保存后更新用户(基本上是一个触发器,但在我的代码中完成)。关于我如何处理这个问题的任何其他想法?有没有办法可以在数据库中的列上设置默认值?

我正在使用 Asp.Net MVC 2、C# 4、EF4 和 SQL Server 2008。

【问题讨论】:

    标签: sql-server triggers default-value


    【解决方案1】:
    Select Coalesce(DisplayName, 'User' + Cast(UserID as varchar)) as UserName
    

    【讨论】:

    • 呃!谢谢。这让我意识到这是业务逻辑,所以它属于我的 BL。我可以更改我的 DisplayName 上的获取代码来执行此操作。
    • 没问题。存储额外字段没有意义,因为数据(用户 ID 和显示名称)已经被存储。尽管我认为根据表的大小,使用 isnull() 代替 Coalesce 可能更有效,因为随着表/查询变大,Coalesce 存在明显的性能问题。
    【解决方案2】:

    您可以在存储过程中设置用户名。如果用户名已传递给存储过程,只需保存即可。否则,获取最后输入的用户的主键 id 并将其加 1。将其格式化为您喜欢的任何内容(例如用户 + newID)并将其保存为新用户的用户名。

    【讨论】:

    • 我对此感到厌倦的唯一原因是因为如果出了什么问题,并且下一个userId是4,但最后一个用户是3。那么它不匹配。
    • @Martin:选择 MAX 主键。将 sp 调用包装在后面代码中的事务中。我觉得你可以走了。
    • @martin:如果您使用默认的 asp.net 会员服务提供商,我在forums.asp.net/p/1417444/… 发了一个帖子,可以帮助您。
    • @Martin - UserId 是身份列吗?如果是这样,您可以使用 SCOPE_IDENTITY 获取最后插入的值,对吗?为什么不匹配?
    • @InSane,它会,但我不想得到 max(UserId),然后设置 DisplayName,然后保存,因为我不认为它会匹配,但如果我换行在交易中,我会准备就绪。
    【解决方案3】:

    你可以有一个计算列

    [UserName] AS ('User' + CAST(UserID AS VARCHAR)) PERSISTED
    

    【讨论】:

    • 如果有人实际传递了用户名,这将如何工作?我可以覆盖它吗?
    • 您不能更新或插入计算列,但您可以有一个 UDF 来决定计算列的值。编写一个接受字符串并决定用户名的 UDF。
    【解决方案4】:

    我倾向于在保存到数据库之前生成它。没有输入 = 补一个。

    我也不会有用户 User1, User2, ... 但用户 + 随机数:user6238945、user9287561、user8934678 等

    如果你使用 1、2、3、4 等,那么你就是在暴露一个内部序列。如果有人得到“user4”,那么我知道存在其他用户 1 到 3,以及第 5 号。AOL 或 Compuserve (?) 多年来一直使用这种曝光来进行网络钓鱼攻击。

    【讨论】:

    • 但是我会有类似SO的东西,比如:http://site.com/users/144496/,这样就可以得到userId,所以我不太关心顺序。我想我唯一担心的是人们在注册时可以看到他们只是第 N 个用户。
    猜你喜欢
    • 2012-05-16
    • 2010-11-07
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多