【发布时间】:2008-12-04 18:21:44
【问题描述】:
如何在 SQL 中实现最后修改的列?
我知道对于创建日期的列,您只需将默认值设置为 getdate()。对于 last-modified 我一直使用触发器,但似乎必须有更好的方法。
谢谢。
【问题讨论】:
标签: sql-server
如何在 SQL 中实现最后修改的列?
我知道对于创建日期的列,您只需将默认值设置为 getdate()。对于 last-modified 我一直使用触发器,但似乎必须有更好的方法。
谢谢。
【问题讨论】:
标签: sql-server
触发器是最好的方法,因为这个逻辑与表密切相关,而不是应用程序。除了更细化的引用完整性之外,这几乎是我能想到的唯一明显正确使用触发器的方法。
但我认为“最后修改”日期无论如何都是一个有缺陷的概念。是什么让“最后更改”的时间戳比之前的时间戳更有价值?您通常需要更完整的审计跟踪。
【讨论】:
在不使用触发器的情况下执行此操作的唯一其他方法是直接通过权限禁止表上的任何插入/更新/删除,并坚持所有这些操作都通过负责设置修改日期的存储过程执行。
管理员可能仍然能够在不使用存储过程的情况下修改数据,但管理员也可以禁用触发器。
如果有很多表需要这种功能,我会倾向于触发器,因为它可以简化代码。简单、编写良好且索引良好的审计触发器通常不会太邪恶 - 只有当您尝试在触发器中放入太多逻辑时,它们才会变得糟糕。
【讨论】:
假设您有一个默认约束,您可以使用关键字 DEFAULT。 插入时不需要指定值,这里也可以使用关键字。
无触发器,与“真实”数据在同一写入中完成
UPDATE
table
SET
blah,
LastUpdatedDateTime = DEFAULT
WHERE
foo = bar
【讨论】:
使用触发器来更新最后修改的列是可行的方法。几乎工作系统中的每条记录都带有添加和更改时间戳,这对我有很大帮助。将其实现为触发器将让您在有任何更改时标记它,无论它是如何启动的。
触发器的另一个好处是,您可以轻松扩展它以存储审计跟踪,而无需太多麻烦。
【讨论】:
只要您这样做,就为 last_updated_by 添加一个字段,并在每次更新记录时更新用户。不如真正的审计表,但比上次更新的日期要好得多。
触发器是您可以用来执行此操作的唯一方法。对于那些说触发器是邪恶的人来说,不,他们不是。到目前为止,它们是维护比简单的默认值或约束更复杂的数据完整性的最佳方式。他们确实需要由真正知道自己在做什么的人编写。但大多数影响数据库设计和完整性的事情都是如此。
【讨论】: