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

How to get data from the current row in INSTEAD OF trigger?

例如,我们有一个名为'Names'的table:

 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

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

在这种情况下 'deleted' table 是怎么回事?

MSDN documentation确实解释了,但布局不是很清楚。

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

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

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

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

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

重要提示

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