Sql server 使用更新值的SQL SERVER触发器
我知道如何使用触发器来恢复我的TICKETS表中所有状态更改的日期: 我确实在上面尝试过,但它的响应是:“无效的对象名‘已更新’”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
您应该使用
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