INSERT удаленные значения в таблицу перед DELETE с помощью DELETE TRIGGER

По какой-то причине я не могу найти точный ответ, который мне нужен. Я искал последние 20 минут здесь.

Я знаю, что это просто. Очень просто. Но я почему-то не могу запустить триггер..

У меня есть таблица с двумя столбцами

dbo.HashTags

|__Id_|_name_|
|  1  | Love |

Я хочу вставить удаленные значения в другую таблицу с именем dbo.HashTagsArchive по запросу DELETE.

Пример:

DELETE FROM [dbo].[HashTags] WHERE Id=1

После этого примера у меня должна быть удаленная строка в dbo.HashTagsArchive, а строка с Id=1 должна быть удалена в dbo.HashTags

Я попробовал этот ТРИГГЕР:

ALTER TRIGGER [dbo].[HashTags_BeforeDelete]
    ON [dbo].[HashTags]
    FOR DELETE
AS
  BEGIN
    INSERT INTO HashTagsArchive
   ( Id,
     HashTagId,
     delete_date)
   SELECT d.Id, m.HashTagId,GETUTCDATE() FROM deleted d 
   JOIN dbo.HashTags m ON m.Id=d.Id
    DELETE FROM dbo.HashTags
    WHERE ID IN(SELECT deleted.Id FROM deleted)
  END
GO

Он получает Deleted, но нет строки Inserted в HashTagsArchive


person Ofear    schedule 24.12.2012    source источник


Ответы (1)


Ваша проблема: этот триггер срабатывает ПОСЛЕ удаления уже произошло. Таким образом, в HashTags больше нет строки, к которой вы могли бы присоединиться!

Вместо этого вам нужно использовать этот триггер:

ALTER TRIGGER [dbo].[HashTags_BeforeDelete]
    ON [dbo].[HashTags]
    FOR DELETE
AS
  BEGIN
    INSERT INTO HashTagsArchive(Id, HashTagId, delete_date)
       SELECT 
           d.Id, d.HashTagId, GETUTCDATE() 
       FROM deleted d 
  END
GO

Псевдотаблица Deleted содержит целые строки, которые были удалены — не нужно ничего объединять...

Кроме того: этот триггер срабатывает после того, как произошло удаление, поэтому вам не нужно ничего делать внутри триггера — просто вставьте эти биты информации в свою архивную таблицу — и все. Все остальное обрабатывается SQL Server за вас.

person marc_s    schedule 24.12.2012