我定义了一个表(参见下面的代码片段).如何添加约束或其他任何内容,以便在更改行时随时更新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 )
Kevin Fairch.. 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',姓氏为'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
我同意其他人 - 在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',姓氏为'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