English 中文(简体)
SQL Server 2005自动更新日期时间列-上次更新
原标题:
  • 时间:2008-08-30 14:48:38
  •  标签:

我已经定义了一个表(请参阅下面的代码片段)。如何添加约束或其他内容,以便在行更改时自动更新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  
)
最佳回答

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

问题回答

我同意其他人的观点——在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(oops),LastUpdate默认为7am

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

  • 2pm - Your slacker coworker finally gets bored with StumbleUpon and checks his email. He sees the earlier message from jsmith regarding the name change. He runs: UPDATE Profiles SET LastName= Smith WHERE Username= jsmith and then goes back to surfing MySpace. The trigger doesn t care that the last name was already Smith , however, so LastUpdate now shows 2pm.

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

--凯文

我同意触发器的想法,尽管我会使用连接来插入而不是子查询。然而,我想指出的是,对于主键来说,用户名是一个特别糟糕的选择。用户名经常更改,当更改时,您需要更改所有相关的表。最好是将用户id作为密钥,然后在username上建立一个唯一的索引。然后,当用户名更改时,您不需要更改任何其他内容。

你将不得不为此使用触发器。

我的建议是创建一个存储过程,将lastUpdate默认为getdate()。

我过去曾试图避免触发,因为在SQL2005之前,定位和编辑它们是一件痛苦的事。特别是对于刚接触项目的开发人员。

还要将其添加为列定义的默认值。





相关问题
热门标签