Sql server 顺序调用的触发器中的SQL server GetDate具有相同的值

Sql server 顺序调用的触发器中的SQL server GetDate具有相同的值,sql-server,Sql Server,我在表上有一个insert、delete、update触发器,它在第一行使用GetDate()方法获取当前日期 触发器将比较删除的表和插入的表,以确定哪些字段已更改,并将id、datetime和更改的字段存储在另一个表中。这种组合必须是唯一的 存储过程按顺序对表执行插入和更新。有时,我会遇到主键冲突,我怀疑GetDate()返回相同的值 如何使GetDate()在触发器中返回不同的值 编辑 这是触发器的代码 CREATE TRIGGER dbo.TR ON table FOR DELETE, I

我在表上有一个insert、delete、update触发器,它在第一行使用GetDate()方法获取当前日期

触发器将比较删除的表和插入的表,以确定哪些字段已更改,并将id、datetime和更改的字段存储在另一个表中。这种组合必须是唯一的

存储过程按顺序对表执行插入和更新。有时,我会遇到主键冲突,我怀疑GetDate()返回相同的值

如何使GetDate()在触发器中返回不同的值

编辑 这是触发器的代码

CREATE TRIGGER dbo.TR
ON table
FOR DELETE, INSERT, UPDATE
AS
BEGIN

SET NoCount ON
DECLARE @dt Datetime
SELECT @dt = GetDate()

insert tableLog (id, date, field, old, new) 
select I.id, @dt, 'field', D.field, I.field
from INSERTED I LEFT JOIN DELETED D ON I.id=D.id
where IsNull(I.field, -1) <> IsNull(D.field, -1)

END

有时两次调用(insert和update)之间的GetDate()需要7毫秒,有时它具有相同的值。

听起来像是在尝试创建审计跟踪,但现在您想伪造一些条目吗

我建议改为在表中添加一列,并将其包含在您的唯一性条件中,或者替代或以及正在记录的
datetime

这样,即使插入了两行相同的日期/时间数据,您仍然可以知道实际的插入顺序。

看看这个答案:


如果插入多行,它们都将使用相同的GetDate()值,因此可以尝试将其包装到UDF中以获得唯一值。但正如我所说,这只是一个猜测,除非您发布触发器的代码,以便我们可以看到您实际在做什么?

这不是完全的解决方案,但请尝试使用SYSDATETIME,当然,请确保目标表可以存储多达微秒的up datetime2

请注意,无论精度如何,您都不能强制使用不同的日期时间(除非您开始计数到滴答声),因为在给定的精度下,事情可能会同时发生


如果扩展到微秒并不能解决实际层面的问题,我认为您必须重新设计此日志模式(可能在现有的基础上添加标识列),或者添加一些肮脏的技巧,比如在try-catch块中插入,并在循环中添加微秒(纳秒?),直到插入成功。绝对不是s.t.我建议。

发布触发器的代码。。。它一定在同一瞬间被多次调用?您是否从触发器调用函数?@Dan-好的,您将在触发器开始时存储一次DateTime,然后为每行插入相同的DateTime。。。因此,如果您有多行,它将确实是相同的日期时间。。。使用自定义项修复此问题—它始终是单行。我也不介意为多行存储相同的日期。我的问题是,插入“transaction”和更新“transaction”的日期相同
...
insert into table ( anotherfield)
            values (@anotherfield)
if @@rowcount=1 SET  @ID=@@Identity

...

update table
   set field    = @field
where Id = @ID

...