9

何らかの理由で、必要な正確な答えが見つかりません。ここでやっと20分探しました。

私はそれが簡単であることを知っています。とてもシンプルです。しかし、なぜかトリガーを発射できません..

2列のテーブルがあります

dbo.ハッシュタグ

|__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がありませんInsertedHashTagsArchive

4

1 に答える 1

16

あなたの問題は次のとおりです。このトリガーは、削除がすでに発生した後に発生します。だから、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 によって処理されます。

于 2012-12-24T08:34:52.157 に答える