我定义了一个表(请参见下面的代码段)。 如何添加约束或其他条件,以便在更改行时自动更新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之前的版本很难找到并编辑触发器。特别是对于您的项目不熟悉的开发人员。
还要将其添加为列定义的默认值。