2013-08-18 4 views
1

Я пытаюсь вызвать событие триггера ON Delete, но когда я пытаюсь выбрать строку из таблицы Deleted, она пуста.Удаленная виртуальная таблица в SQL Server пуста ON Delete trigger

Есть ли другой способ получить идентификатор строки, на которой ушло событие удаления?

Код:

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
go 

ALTER TRIGGER [audit] 
    ON [dbo].[S_PARTY] 
    FOR DELETE 
AS 
    -- Insert statements for trigger here 
    DECLARE @id nvarchar(50) 
    SET @id = (Select ROW_ID from deleted) 

    BEGIN 

-- Insert statements for trigger here 

INSERT INTO [dbo].[S_AMF_AUDIT_ITEM] (ROW_ID) 
    VALUES (@id); 

END 

Когда триггер срабатывает на это, я получаю сообщение об ошибке, как S_AMF_AUDIT_ITEM не допускает пустых значений. Можете ли вы, пожалуйста, помочь мне получить идентификатор таблицы, на которой выполняется команда удаления?

ответ

2

Ваш триггер не работает.

Не учитывается, что оператор DELETE может влиять на ноль или более чем на одну строку.

Вопрос с NULL может возникнуть для справки DELETE FROM [dbo].[S_PARTY] WHERE 1 = 0.

Неподвижная версия будет

ALTER TRIGGER [audit] 
ON [dbo].[S_PARTY] 
FOR DELETE 
AS 
    BEGIN 
     INSERT INTO [dbo].[S_AMF_AUDIT_ITEM] 
        (ROW_ID) 
     SELECT ROW_ID 
     FROM deleted; 
    END 
+0

работал !! .. но я до сих пор не понимаю, почему SET @id = (выберите ROW_ID из удаленной) не устанавливает значение. Я уверен, что я удаляю только одну строку за раз. и Id существует в таблице S_PARTY, откуда я пытаюсь удалить. – rishman

1

Триггер может сгореть для 0..N удаленных строк. Например:

delete YourTable 
where 1=2 

бы запустить for delete триггер на YourTable. Таким образом, триггер должен иметь дело с нулем или несколькими строками. Рассмотрим переписывание вашего кулачка, как:

ALTER TRIGGER [audit] ON [dbo].[S_PARTY] FOR DELETE 
AS 
INSERT dbo.S_AMF_AUDIT_ITEM 
     (ROW_ID) 
SELECT ROW_ID 
FROM deleted 

Это будет работать для любого количества вставленных строк.