【问题标题】:Best way to implement a last-modified column in Sql Server 2005?在 Sql Server 2005 中实现最后修改列的最佳方法?
【发布时间】:2008-12-04 18:21:44
【问题描述】:

如何在 SQL 中实现最后修改的列?

我知道对于创建日期的列,您只需将默认值设置为 getdate()。对于 last-modified 我一直使用触发器,但似乎必须有更好的方法。

谢谢。

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    触发器是最好的方法,因为这个逻辑与表密切相关,而不是应用程序。除了更细化的引用完整性之外,这几乎是我能想到的唯一明显正确使用触发器的方法。

    但我认为“最后修改”日期无论如何都是一个有缺陷的概念。是什么让“最后更改”的时间戳比之前的时间戳更有价值?您通常需要更完整的审计跟踪。

    【讨论】:

    • 我在患者网格中使用它,以便医生可以看到他们修改的最后一个,尽管我同意他们最后一次访问的日期似乎更有用...
    • 如果这是他们修改的最后一个患者,而不是他们最后一次修改每个患者,那么它更需要放在单独的表中 - 或者在全球其他地方持久化。
    • 我认为过去他们说的是“治疗”或“治愈”,而不是“修改”。 SCNR ;-) 更严重的是,我同意 @doofledorfer 的观点,因为 LastModified 日期不是很有用,因为它几乎没有任何信息,可能会导致错误的结论。
    【解决方案2】:

    在不使用触发器的情况下执行此操作的唯一其他方法是直接通过权限禁止表上的任何插入/更新/删除,并坚持所有这些操作都通过负责设置修改日期的存储过程执行。

    管理员可能仍然能够在不使用存储过程的情况下修改数据,但管理员也可以禁用触发器。

    如果有很多表需要这种功能,我会倾向于触发器,因为它可以简化代码。简单、编写良好且索引良好的审计触发器通常不会太邪恶 - 只有当您尝试在触发器中放入太多逻辑时,它们才会变得糟糕。

    【讨论】:

      【解决方案3】:

      假设您有一个默认约束,您可以使用关键字 DEFAULT。 插入时不需要指定值,这里也可以使用关键字。

      无触发器,与“真实”数据在同一写入中完成

      UPDATE
         table
      SET
         blah,
         LastUpdatedDateTime = DEFAULT
      WHERE
         foo = bar
      

      【讨论】:

      • 同意。除非您应该将其声明为表模式中的列的 DEFAULT。
      • 触发器是邪恶的......不,它们真的是。
      • 不,适用于 UPDATE msdn.microsoft.com/en-us/library/ms177523(SQL.90).aspx ... SET { column_name = { expression |默认 |空} ...
      • 同意并养你一个。但这是将其用于邪恶目的。 :)
      • gbn,你是对的 - 新事实。但这比触发器更邪恶。 :)
      【解决方案4】:

      使用触发器来更新最后修改的列是可行的方法。几乎工作系统中的每条记录都带有添加和更改时间戳,这对我有很大帮助。将其实现为触发器将让您在有任何更改时标记它,无论它是如何启动的。

      触发器的另一个好处是,您可以轻松扩展它以存储审计跟踪,而无需太多麻烦。

      【讨论】:

        【解决方案5】:

        只要您这样做,就为 last_updated_by 添加一个字段,并在每次更新记录时更新用户。不如真正的审计表,但比上次更新的日期要好得多。

        触发器是您可以用来执行此操作的唯一方法。对于那些说触发器是邪恶的人来说,不,他们不是。到目前为止,它们是维护比简单的默认值或约束更复杂的数据完整性的最佳方式。他们确实需要由真正知道自己在做什么的人编写。但大多数影响数据库设计和完整性的事情都是如此。

        【讨论】:

        • 同意。请注意我关于“更细粒度的引用完整性”的陈述。
        猜你喜欢
        • 1970-01-01
        • 2013-05-25
        • 2010-09-17
        • 2010-10-16
        • 2013-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-01
        相关资源
        最近更新 更多