SQL Server 2005自动更新的DateTime列 - LastUpdated

Bri*_*ght 13 database sql-server timestamp sql-update

我定义了一个表(参见下面的代码片段).如何添加约束或其他任何内容,以便在更改行时随时更新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  
)
Run Code Online (Sandbox Code Playgroud)

Kev*_*ild 24

我同意其他人 - 在LastUpdate列上设置GetDate()的默认值,然后使用触发器来处理任何更新.

就像这样简单:

CREATE TRIGGER KeepUpdated on Profiles
FOR UPDATE, INSERT AS 
UPDATE dbo.Profiles 
SET LastUpdate = GetDate()
WHERE Username IN (SELECT Username FROM inserted)
Run Code Online (Sandbox Code Playgroud)

如果你想变得非常花哨,那么让它评估一下被改变的内容与数据库中的内容有什么关系,只有在存在差异时才修改LastUpdate.

考虑一下......

  • 早上7点 - 创建用户'jsmith',姓氏为'Smithe'(oops),LastUpdate默认为上午7点

  • 早上8点 - 'jsmith'给IT发电子邮件说他的名字不正确.您立即执行更新,因此姓氏现在是'Smith'并且(由于触发器)LastUpdate显示为8am

  • 下午2点 - 你的懒人同事终于厌倦了StumbleUpon并检查他的电子邮件.他看到了"jsmith"关于名称更改的早期消息.他运行:UPDATE配置文件SET LastName ='Smith'WHER用户名='jsmith',然后返回冲浪MySpace.触发器并不关心姓氏是否已经是"史密斯",所以LastUpdate现在显示下午2点.

如果只是在更新语句运行时盲目地更改LastUpdate,那么它在技术上是正确的,因为更新确实发生了,但实际比较更改并相应地采取行动可能更有意义.这样,同事的下午2点更新声明仍然会运行,但LastUpdate仍会显示早上8点.

--Kevin


SQL*_*ace 4

默认约束仅适用于插入;对于更新,请使用触发器。