1

我想在已删除的记录上设置日期/时间戳,但我得到了奇怪的结果。当此触发器触发时,它将日期设置为 1906!

我尝试GETDATE()在查询中使用该函数,并UPDATE在表属性上使用默认值。它适用于我手动输入到DELETED_RECORDS表中的记录,但由于实际删除而移入的任何记录都有 1906 年的日期。我不确定发生了什么

ALTER TRIGGER [dbo].[Backup_TT_Deleted_Records]
ON [dbo].[tblLLS_TT]
FOR DELETE
AS
  BEGIN
      INSERT INTO dbo.tblLLS_TT_DELETED_RECORDS
      SELECT *
      FROM   Deleted

      UPDATE dbo.tblLLS_TT_DELETED_RECORDS
      SET    Deleted_DTTM = GETDATE()
      WHERE  dbo.tblLLS_TT_DELETED_RECORDS.Deleted_DTTM IS NULL
  END 

同样使用上面的触发器,如果​​我在DELETED_RECORDS表上输入一条记录,留下Delete_DTTM空值,然后删除一条导致触发器触发的记录,它将正确填写该记录,但删除进入DELETED_RECORDS表的记录将再次具有日期1906. 我还注意到每条记录的日期递增一天。

知道这里可能会发生什么吗?

您希望我执行的任何其他测试让我知道,我会发布结果。这个很奇怪。谢谢!

4

2 回答 2

6

你的插入语句如下

INSERT INTO dbo.tblLLS_TT_DELETED_RECORDS
SELECT *
FROM   Deleted 

您既没有使用显式的列列表,INSERT也没有在SELECT.

你说

我还注意到每条记录的日期增加一天。

我的猜测是源中的列没有插入到您认为的目标列中。

如果您正在删除一批具有IDENTITY列值的行2191 - 2555并将该int值插入到datetime列中,您将获得隐式转换为 1906 年的日期(整数被视为表示自1900 年 1 月1日以来的天数)

我假设源列很可能IDENTITY会解释日期的升序性质。要解决此问题,请尝试明确指定两个列列表。同样重要的是要注意等效的源列和目标列必须位于相同的序号位置。例如,SQL Server 不会根据列名匹配它们。

INSERT INTO dbo.tblLLS_TT_DELETED_RECORDS
            (col1,
             col2,
             col3)
SELECT col1,
       col2,
       col3
FROM   Deleted 

你也不需要单独的UPDATE声明,你可以在INSERT

INSERT INTO dbo.tblLLS_TT_DELETED_RECORDS
            (col1,
             col2,
             col3,
             Deleted_DTTM)
SELECT col1,
       col2,
       col3,
       getdate()
FROM   Deleted 
于 2013-01-03T21:55:13.313 回答
1

如果你执行,你会得到什么价值?

SELECT GETDATE();

也许是错误配置的服务器时间。您还可以使“Deleted_DTTM”列的默认值采用其默认系统日期,然后您可以跳过最后一个更新语句。

于 2013-01-03T19:43:08.303 回答