SQL Server 2005 自动更新的日期时间列 - LastUpdated
Posted
技术标签:
【中文标题】SQL Server 2005 自动更新的日期时间列 - LastUpdated【英文标题】:SQL Server 2005 Auto Updated DateTime Column - LastUpdated 【发布时间】:2010-09-07 08:26:53 【问题描述】:我定义了一个表(参见下面的代码 sn-p)。如何添加约束或其他任何内容,以便在更改行时自动更新 LastUpdate 列?
CREATE TABLE dbo.Profiles
(
UserName varchar(100) NOT NULL,
LastUpdate datetime NOT NULL CONSTRAINT DF_Profiles_LastUpdate DEFAULT (getdate()),
FullName varchar(50) NOT NULL,
Birthdate smalldatetime NULL,
PageSize int NOT NULL CONSTRAINT DF_Profiles_PageSize DEFAULT ((10)),
CONSTRAINT PK_Profiles PRIMARY KEY CLUSTERED (UserName ASC),
CONSTRAINT FK_Profils_Users FOREIGN KEY (UserName) REFERENCES dbo.Users (UserName) ON UPDATE CASCADE ON DELETE CASCADE
)
【问题讨论】:
【参考方案1】:我同意其他人的观点——在 LastUpdate 列上设置 GetDate() 的默认值,然后使用触发器来处理任何更新。
就这么简单:
CREATE TRIGGER KeepUpdated on Profiles
FOR UPDATE, INSERT AS
UPDATE dbo.Profiles
SET LastUpdate = GetDate()
WHERE Username IN (SELECT Username FROM inserted)
如果您想变得更花哨,请让它评估正在更改的内容与数据库中的内容,并且仅在存在差异时修改 LastUpdate。
考虑一下...
7am - 用户“jsmith”是用姓氏“Smithe”(哎呀)创建的,LastUpdate 默认为早上 7 点
上午 8 点 - 'jsmith' 向 IT 部门发送电子邮件说他的名字不正确。您立即执行更新,所以姓氏现在是“Smith”并且(感谢触发器)LastUpdate 显示上午 8 点
下午 2 点 - 你懒散的同事终于对 StumbleUpon 感到厌烦并查看他的电子邮件。他看到了来自“jsmith”的关于更名的较早消息。他运行:UPDATE Profiles SET LastName='Smith' WHERE Username='jsmith' 然后继续 回到浏览 MySpace。但是,触发器并不关心姓氏已经是“Smith”,因此 LastUpdate 现在显示为下午 2 点。
如果您只是在更新语句运行时盲目地更改 LastUpdate,这在技术上是正确的,因为确实发生了更新,但实际比较更改并采取相应措施可能更有意义。这样,同事的 2pm Update 语句仍会运行,但 LastUpdate 仍会显示 8am。
--凯文
【讨论】:
【参考方案2】:默认约束仅适用于插入;对于更新,请使用触发器。
【讨论】:
【参考方案3】:我同意触发器的想法,尽管我会使用连接来插入而不是子查询。但是,我想指出,用户名对于主键来说是一个特别糟糕的选择。用户名经常发生变化,当它们发生变化时,您需要更改所有相关表。最好有一个用户 ID 作为键,然后在用户名上放置一个唯一索引。那么当用户名改变时,你不需要改变任何其他东西。
【讨论】:
【参考方案4】:您将不得不为此使用触发器。
【讨论】:
【参考方案5】:我的建议是创建一个默认 lastUpdate 为 getdate() 的存储过程。
我过去曾尝试避免使用触发器,因为 SQL2005 之前的定位和编辑它们是一件很麻烦的事情。特别是对于刚接触您的项目的开发人员。
还将它添加为列定义的默认值。
【讨论】:
这样的事情必须始终在触发器中完成。否则它并不总是正确的,因为有很多方法可以在不使用 sps 的情况下更改数据。如果您想要数据库中的准确数据(这应该是优先级 1),就没有理由避免它们。 我猜 Rob Allen 想说的是,他在触发器中执行了一个存储过程,其中所有逻辑和条件都存在,因此不需要注意潜在的触发器,而只需要注意具有明显命名模式的 SP,例如spAfterUpdateMyTable
以上是关于SQL Server 2005 自动更新的日期时间列 - LastUpdated的主要内容,如果未能解决你的问题,请参考以下文章
了解 SQL Server 2005 数据库中特定日期修改了多少表
什么是自动从 2005 数据库同步 sql server 2008 数据库的好方法?