【问题标题】:best way to track time for create and update in SQL server在 SQL Server 中跟踪创建和更新时间的最佳方法
【发布时间】:2011-04-10 20:28:46
【问题描述】:

我有一个使用 nhibernate 与 SQL Server 2005 对话的网站。

我现在希望每条记录都有一个 createdDateTime 和 lastUpdatedDateTime 字段。这个值应该设置在哪里。我担心时区、一致性等问题。 .对以下选项有任何想法:

  1. 在我的应用程序代码中(在我写之前)
  2. 在 SQL Server 内部(使用触发器或其他函数)
  3. 其他??

【问题讨论】:

    标签: c# sql-server asp.net-mvc nhibernate


    【解决方案1】:

    最好处理这些directly by SQL Server 以确保真正的数据完整性。就一致性而言,将使用服务器时间,因此应该没有问题。您可以按照@gbn 在 cmets 中的建议在 SQL Server 中使用 UTC 时间。

    【讨论】:

    • 我想补充一下,你也可以在 SQL Server 中使用 UTC 时间
    • @gbn,好点子,我已经更新了我的答案以将其考虑在内。
    【解决方案2】:

    虽然 Darin Dimitrov 的回答完全有效,但如果您希望相关的 DateTime 字段反映业务逻辑一致性,则必须考虑到:

    使用仅 DB 方法,您必须使用 GetDate() 函数,该函数对于插入的每一行都不同。对于更大的插入集,您将为插入的第一个和最后一个项目设置不同的时间戳。

    如果您在应用程序中执行此操作,您可以为所有插入/更新的项目分配相同的 DateTime 值。

    这对您来说可能重要也可能不重要,这取决于您的需求

    在 Web 应用程序和每个请求的事务模式中,这是有道理的,因为您可以明确地跟踪每个请求在数据库中所做的事情,也许是出于报告的原因。

    【讨论】:

      【解决方案3】:

      您可以使用 NHibernate 事件。它们工作得很好,虽然我同意审计通常由 Sql Server 本身更好地处理,但有这个选项总是很好的。可以看完整教程here

      【讨论】:

        【解决方案4】:

        如果您通过 DateTime.Now 之类的代码更新 LastUpdateTime,那么它将占用服务器的 DateTime 。在此阶段,将仅考虑服务器时区。

        如果您真的想考虑客户时区,最好使用 javascript 来传递客户日期时间和区域。在表格列中也有一个区域字段并更新区域以进行正确的日期时间操作。

        Sql Server 有一个很好的 TimeZone 数据类型。所以你可以有一个这样的列。请参考以下链接。

        http://www.sql-server-performance.com/articles/dev/datetime_2008_p1.aspx

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多