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

Ofe*_*ear 8 sql t-sql sql-server triggers sql-delete

由于某种原因,我无法找到我需要的确切答案.我在这里搜索了最后20分钟.

我知道这很简单.非常简单.但出于某种原因我无法触发触发器..

我有一个有两列的表

dbo.HashTags

|__Id_|_name_|
|  1  | Love |
Run Code Online (Sandbox Code Playgroud)

我想将删除的值插入另一个dbo.HashTagsArchiveDELETE查询上调用的表中.

例:

DELETE FROM [dbo].[HashTags] WHERE Id=1
Run Code Online (Sandbox Code Playgroud)

这个例子后,我应该有删除的行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
Run Code Online (Sandbox Code Playgroud)

它已经到了,Deleted但没有InsertedHashTagsArchive

mar*_*c_s 14

你的问题是:这个触发器在删除已经发生之后触发.所以没有更多的行可以加入!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
Run Code Online (Sandbox Code Playgroud)

Deleted伪表包含整行(S)已删除的-无需加入任何东西...

另外:在删除发生后触发此触发器 - 因此您不需要在触发器内自行执行任何操作 - 只需将这些信息插入存档表即可 - 这就是全部.其他所有内容都由SQL Server为您处理.