timestamp,rowversion和datetime - 插入或更新行时需要标记

时间:2013-05-22 09:08:11

标签: sql timestamp rowversion

我有以下要求:

我有一个包含1个唯一自动增量Int ID和数据列的表。 我需要以下内容: 每次在该表中插入一行时,表右端的列必须保存该插入的完整日期时间。 此外,如果更新了一行,我需要将该行的插入的完整日期时间保存到表中的列,以便更新以保存该行的更新时间。

现在,显而易见且非常直接的方法是: 你创建你的表:

create table My_Test_Table
(my_id int identity not null,
my_data nvarchar(max));

你改变了你的表,在其上添加了datetime列和一个Default限制:

ALTER TABLE My_Test_Table
ADD [timestamp] datetime;
ALTER TABLE My_Test_Table
ADD CONSTRAINT DF_My_Test_Table_timestamp DEFAULT GETDATE() FOR [timestamp];

然后你做了一个很好的更新触发器,如下所示:

CREATE TRIGGER DML_Trigger_update_My_Test_Table
ON My_Test_Table
FOR UPDATE
AS
IF @@ROWCOUNT <> 0
BEGIN
IF EXISTS (SELECT * FROM INSERTED) AND EXISTS (SELECT * FROM DELETED)
BEGIN
UPDATE My_Test_Table
SET [timestamp] = GETDATE()
FROM INSERTED
WHERE My_Test_Table.my_id = INSERTED.my_id;
END
END

现在棘手的部分是: 出于超出范围的原因,我希望如上所述实现这一点,但没有触发器! 可能吗? 我不想使用SQL类型的时间戳或rowversion,这对我来说不起作用,我需要将日期,时间缩短到毫秒,以便明确存储在该列中。 任何想法都会非常感激。

1 个答案:

答案 0 :(得分:4)

您不需要触发器

您可以使用DEFAULT关键字作为UPDATE语句中的源值,以及在该列上定义的DEFAULT约束

UPDATE
   MyTable
SET
   foo = ...,
   bar = ...,
   ChangedDateTime = DEFAULT
WHERE
   ...;

我不会使用名为timestamp because this has meaning on SQL Server, as a synonym for rowversion的列。对于SQL Server 2008+,使用datetime2(3)来准确记录毫秒数。 “旧”datetime仅精确到3.33毫秒