2017-03-29 19 views
0

注意!私にはトリガを使う必要があります!次のタスクを実行するために必要な唯一の方法は、トリガを使用することです!SQL Server 2014、trigger:削除された行を反復処理する方法は?

質問があります - 特定のテーブルの行S削除で呼び出されるトリガーが必要です。トリガーは、削除されたすべての行を繰り返し実行し、現在の反復行の値に応じていくつかのコードを実行します。

例えば、私はトリガーがここにあるコマンドによって

DELETE FROM books WHERE id=5 

を1行 を削除するときに動作しており、このトリガーを作った:だから

GO 
CREATE TRIGGER onBookDelete ON books 
INSTEAD OF DELETE 
AS 
DECLARE @book_id int 
BEGIN 

    SET NOCOUNT ON; 

    SELECT id FROM deleted 
    SET @book_id = (SELECT id FROM deleted) 
    PRINT @book_id 
    BEGIN 
     DELETE FROM "books-topics" WHERE [email protected]_id 
     DELETE FROM "books-genres" WHERE [email protected]_id 
     DELETE FROM books WHERE [email protected]_id 
    END 
END; 

、私が達成したいもの - であるが同じタスクでトリガーを作成するには、を使用しますが、一度に多くの行を削除すると機能するはずです。たとえば、

DELETE FROM books WHERE id=5 OR id=3 OR id=8 
私が意味する、同じタスクで10

は、例えば、

DELETE FROM "books-topics" WHERE id=DELETEDROW.book_id 
DELETE FROM "books-genres" WHERE id=DELETEDROW.book_id 
DELETE FROM books WHERE id=DELETEDROW.book_id 
+4

をこの持っている[XYPropblem](http://meta.stackexchange.com/questions/66377/what -is-the-xy-problem)それの上に書かれています。あなたが使用しようとしているソリューションではなく、解決しようとしている問題について質問を編集してください。 –

+3

「ON DELETE CASCADE」で外部キーを宣言するだけではどうですか? –

+0

行を削除した後に何かしたい場合は、AFTERトリガーを使用します。削除をカスケードするためにトリガーは必要ありません。 –

答えて

1

それぞれ削除された行に、次のコードを呼び出すあなたの教師ではなく、削除トリガーのためのより良い例について考えているはずです。この問題は、最初に削除カスケードが存在する場合に発生します。あなたの割り当ては、トリガーを使用することですので、

しかし、私の代わりにこのような何かを示唆している:

CREATE TRIGGER onBookDelete ON books 
INSTEAD OF DELETE 
AS 
BEGIN 

    SET NOCOUNT ON; 

    BEGIN TRASACTION 
    BEGIN TRY 
     DELETE bt 
     FROM "books-topics" bt 
     INNER JOIN deleted d ON bt.book_id= d.book_id 

     DELETE bg 
     FROM "books-genres" bg 
     INNER JOIN deleted d ON bg.book_id= d.book_id 

     DELETE b 
     FROM books b 
     INNER JOIN deleted d ON b.book_id= d.book_id 

     COMMIT TRANSACTION 
    END TRY 
    BEGIN CATCH 
    IF @@TRANCOUNT > 0 
     ROLLBACK TRANSACTION 
    END CATCH 
END; 
+0

ああ私が見る。ここでトランザクションを使用するとは思わなかった。 –

関連する問題