使用DELETE TRIGGER在DELETE之前将删除的值INSERT到表中

时间:2012-12-24 08:31:06

标签: sql sql-server tsql triggers sql-delete

出于某种原因,我找不到我需要的确切答案。我在这里搜索了最后20分钟。

我知道这很简单。非常简单。但由于某种原因,我不能解雇触发器。

我有一个包含两列的表

dbo.HashTags

|__Id_|_name_|
|  1  | Love |

我想在dbo.HashTagsArchive查询中将已删除的值插入另一个名为DELETE的表中。

示例:

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

在此示例之后,我应该在dbo.HashTagsArchive中删除已删除的行,并且应在Id=1中删除包含dbo.HashTags的行

我试过这个TRIGGER:

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

1 个答案:

答案 0 :(得分:14)

您的问题是:此触发器触发 AFTER 删除已经发生。所以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为您处理。