如何在INSTEAD OF触发器中从当前行获取数据?

时间:2018-09-30 08:54:56

标签: sql-server tsql triggers sql-delete

例如,我们有一个名为“名称”的表:

 id  |  name
-----+------
 1   |  Mary
 2   |  Sue
 3   |  John

和此触发器:

CREATE TRIGGER TRG_insofdel
ON Names 
INSTEAD OF DELETE
AS 
BEGIN
    -- here I need to get some data from the current row
END

然后我打电话

DELETE FROM Names 
WHERE id = 1

如何在触发器中获取玛丽(id == 1)的名字?

在这种情况下,“已删除”表是怎么回事?

1 个答案:

答案 0 :(得分:2)

MSDN documentation确实可以解释,但布局并不十分清楚。

在触发器中,SQL Server自动为您提供2个特殊的内存表:

  • inserted:添加到表中的数据(用于插入和更新语句)
  • deleted:从表中删除的数据(用于更新和删除语句)

它们与实际表具有相同的列,但完全是只读的-您无法向它们添加列或索引或更改其中的数据。

因此,在您的示例中,要获取要删除的人员的姓名,可以在触发器内执行以下操作:

DECLARE @name varchar(100);
SELECT @name = name from deleted;

重要提示

请注意,如果从表中删除了多行,则deleted将包含多行-触发器不会为每一行单独调用一次。