我有以下要求:
我有一个包含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,这对我来说不起作用,我需要将日期,时间缩短到毫秒,以便明确存储在该列中。 任何想法都会非常感激。
答案 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毫秒