0

我有以下要求:

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

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

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

你改变你的表添加日期时间列和它的默认约束:

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 类型的时间戳或行版本,这对我不起作用,我需要将日期、时间精确到毫秒才能清楚地存储在该列中。任何想法将不胜感激。

4

1 回答 1

4

你不需要触发器

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

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

我不会使用名为的列,timestamp因为这在 SQL Server 上具有意义,作为rowversion. 对于 SQL Server 2008+ datetime2(3),用于准确记录毫秒。“旧”datetime仅精确到四舍五入的 3.33 毫秒

于 2013-05-22T10:03:44.017 回答