Sql server 使用更新值的SQL SERVER触发器

Sql server 使用更新值的SQL SERVER触发器,sql-server,triggers,Sql Server,Triggers,我知道如何使用触发器来恢复我的TICKETS表中所有状态更改的日期: 我确实在上面尝试过,但它的响应是:“无效的对象名‘已更新’” 您应该使用INSERTED表而不是UPDATED,因为更新操作包括删除和插入操作 在DELETED表中,您将找到旧值;在INSERTED中,您将找到新的(更新的)值 此外,在触发器声明中,您应该使用FOR关键字,而不是ON来引用应该启动触发器的操作 例如 你应该拥有的是: CREATE TRIGGER TG_TICKETS_STATUS_HISTORY ON TIC

我知道如何使用触发器来恢复我的TICKETS表中所有状态更改的日期: 我确实在上面尝试过,但它的响应是:“无效的对象名‘已更新’”


您应该使用
INSERTED
表而不是
UPDATED
,因为更新操作包括删除和插入操作

DELETED
表中,您将找到旧值;在
INSERTED
中,您将找到新的(更新的)值

此外,在触发器声明中,您应该使用
FOR
关键字,而不是
ON
来引用应该启动触发器的操作

例如


你应该拥有的是:

CREATE TRIGGER TG_TICKETS_STATUS_HISTORY
ON TICKETS_TI AFTER UPDATE 
AS 
BEGIN

INSERT INTO TICKETS_STATUS_HISTORY (ID,STS_NAME,STS_DATE)
select i.ID,i.Status,GETDATE()
from inserted i
    inner join (
     select ID,STS_NAME,
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY STS_DATE desc) as rn
     from TICKETS_STATUS_HISTORY
    ) h
      on
         i.ID = h.ID and
         i.STATUS != h.STS_NAME and
         h.rn = 1

END
插入的
(和
删除的
)是可以包含0、1或多行的。将列值从中分配到标量变量(例如

)这完全是错误的


如果您只想检查状态列值是否已更改(并且不需要在历史记录表中查找),我们可以使其更简单:

INSERT INTO TICKETS_STATUS_HISTORY (ID,STS_NAME,STS_DATE)
select i.ID,i.Status,GETDATE()
from inserted i
    inner join
     deleted d
      on
         i.ID = d.ID and
         i.STATUS != d.STATUS

@Damien_不相信你是对的,他应该加入更新的表来插入多行。我把重点放在他的语法和概念错误上。我认为你不能以CTE的名义使用
,你仍然需要删除里面的
@ID
引用。是的,@Damien\u不信者,我是走捷径:)
CREATE TRIGGER TG_TICKETS_STATUS_HISTORY
ON TICKETS_TI AFTER UPDATE 
AS 
BEGIN

INSERT INTO TICKETS_STATUS_HISTORY (ID,STS_NAME,STS_DATE)
select i.ID,i.Status,GETDATE()
from inserted i
    inner join (
     select ID,STS_NAME,
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY STS_DATE desc) as rn
     from TICKETS_STATUS_HISTORY
    ) h
      on
         i.ID = h.ID and
         i.STATUS != h.STS_NAME and
         h.rn = 1

END
SELECT @ID = ID, 
    @STATUS = STATUS
FROM INSERTED 
INSERT INTO TICKETS_STATUS_HISTORY (ID,STS_NAME,STS_DATE)
select i.ID,i.Status,GETDATE()
from inserted i
    inner join
     deleted d
      on
         i.ID = d.ID and
         i.STATUS != d.STATUS