如何从 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
将包含多行 - 不会为每一行单独调用一次触发器。
例如,我们有一个名为'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
将包含多行 - 不会为每一行单独调用一次触发器。