SQL 选择 WHERE 行已更新

Ago*_*ony 2 trigger sql-server select update

USE [RF_WORLD]
GO
/****** Object:  Trigger [dbo].[lastdeathtrigg]    Script Date: 08/20/2012 10:52:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      Mauro Tamm
-- =============================================
ALTER TRIGGER [dbo].[lastdeathtrigg]
   ON  [dbo].[tbl_pvporderview]
   AFTER UPDATE
AS 
IF (UPDATE(Death))
BEGIN
    SET NOCOUNT ON;
DECLARE @userserial int;
SELECT @userserial ='serial' WHERE UPDATE(Death)
Insert INTO [RF_WORLD].[dbo].[lastdeath]
(serial)
VALUES (@userserial)
END
Run Code Online (Sandbox Code Playgroud)

where 部分是可疑的,它会像那样工作吗?本质上,如果它实际更新,我只需要它选择行序列值。

Aar*_*and 6

你的触发器有几个问题:

  1. 您假设触发器按行触发,而触发器按语句触发。这意味着您不能只分配一个变量,因为如果更新影响多于一行,这将不起作用。
  2. 您分配变量的查询不会从任何地方提取 - 您需要引用inserted和/或deleted伪表。
  3. 检查UPDATE()只会告诉您该列已被引用,但不会告诉您该值是否已更改。

以下是我将如何重写您的触发器:

-- this assumes Death is not nullable

ALTER TRIGGER [dbo].[lastdeathtrigg]
   ON  [dbo].[tbl_pvporderview]
   AFTER UPDATE
AS 
IF (UPDATE(Death))
BEGIN
  SET NOCOUNT ON;

  INSERT RF_WORLD.dbo.lastdeath(serial)
    SELECT i.serial FROM inserted AS i
    INNER JOIN deleted AS d
    ON i.serial = d.serial 
    AND i.Death <> d.Death;
END
GO
Run Code Online (Sandbox Code Playgroud)