关于数据库:SQL Server 2005自动更新的DateTime列-LastUpdated

关于数据库:SQL Server 2005自动更新的DateTime列-LastUpdated

SQL Server 2005 Auto Updated DateTime Column - LastUpdated

我定义了一个表(请参见下面的代码段)。 如何添加约束或其他条件,以便在更改行时自动更新LastUpdate列?

1
2
3
4
5
6
7
8
9
10
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()的默认值,然后使用触发器来处理所有更新。

就像这样简单:

1
2
3
4
5
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"的姓氏为" Smithe"(哎呀),LastUpdate默认为上午7点

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

  • 下午2点-懒惰的同事终于对StumbleUpon感到无聊,并检查了他的电子邮件。他看到了来自" jsmith"的较早消息,内容涉及更名。他运行:更新配置文件SET LastName ='Smith'WHERE Username ='jsmith',然后运行
    回到网上冲浪。触发器并不关心姓氏已经是" Smith",但是,LastUpdate现在显示2pm。

如果您只要在运行更新语句时就盲目更改LastUpdate,则从技术上来说是正确的,因为确实发生了更新,但是实际比较更改并采取相应措施可能更有意义。这样,同事的2pm Update语句仍将运行,但是LastUpdate仍将显示上午8点。

-凯文


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


我同意触发器的想法,尽管我将使用联接来插入而不是子查询。但是,我想指出的是,用户名对于主键来说是一个特别糟糕的选择。用户名经常更改,并且您需要在什么时候更改所有相关表。最好以用户ID为键,然后在用户名上添加唯一索引。然后,当用户名更改时,您无需更改其他任何内容。


您将必须为此使用触发器。


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

我过去曾尝试避免使用触发器,因为SQL2005之前的版本很难找到并编辑触发器。特别是对于您的项目不熟悉的开发人员。

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


推荐阅读