Как получить данные из текущей строки в триггере INSTEAD OF? - PullRequest
0 голосов
/ 30 сентября 2018

Например, у нас есть таблица с именем «Имена»:

 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 голосов
/ 30 сентября 2018

Документация MSDN объясняет, но не очень четко изложена.

В триггере SQL-сервер автоматически предоставляет вам две специальные таблицы в памяти:

  • inserted: данные, которые были добавлены в таблицу (для операторов вставки и обновления)
  • deleted: данные, которые были удалены из таблицы (для операторов обновления и удаления))

Они имеют те же столбцы, что и фактическая таблица, но полностью доступны только для чтения - вы не можете добавлять к ним столбцы или индексы или изменять данные внутри них.

Так что вВ вашем примере, чтобы получить имя удаляемого человека, вы можете внутри триггера сделать следующее:

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

Важное примечание

Имейте в виду, что еслииз таблицы было удалено несколько строк, тогда deleted будет содержать несколько строк - триггер не вызывается отдельно для каждой строки.

...