13

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

5 回答 5

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)

如果您想真正花哨,请让它评估正在更改的内容与数据库中的内容,并且仅在存在差异时才修改 LastUpdate。

考虑这个...

  • 早上 7 点- 创建用户“jsmith”,姓氏“史密斯”(哎呀),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。

——凯文

于 2008-08-30T16:02:47.387 回答
4

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

于 2008-08-30T14:55:17.923 回答
3

我同意触发的想法,尽管我会使用连接来插入而不是子查询。但是,我想指出,用户名对于主键来说是一个特别糟糕的选择。用户名经常发生变化,当它们发生变化时,您需要更改所有相关表。最好有一个用户 ID 作为键,然后在用户名上放置一个唯一索引。然后当用户名改变时,你不需要改变其他任何东西。

于 2009-04-15T13:29:41.610 回答
2

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

于 2008-08-30T14:50:08.123 回答
-1

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

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

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

于 2008-08-30T14:58:38.930 回答