2012-04-03 9 views
19

私は、database2.table2の行が削除されたときに、database1.table1から行を条件付きで削除する基本的なデータベーストリガーを作成しようとしています。私はトリガーには新しく、これを達成する最善の方法を学ぶことを望んでいました。これは私がこれまで持っていたものです。提案?SQL Server ON DELETEトリガー

CREATE TRIGGER sampleTrigger 
    ON database1.dbo.table1 
    FOR DELETE 
AS 
    IF EXISTS (SELECT foo 
       FROM database2.dbo.table2 
       WHERE id = deleted.id 
       AND bar = 4) 

-- If there is a row that exists in database2.dbo.table2 
-- matching the id of the deleted row and bar=4, delete 
-- it as well. 

-- DELETE STATEMENT? 

GO 
+4

うトリガーが発動されたことを考慮に入れる** **ステートメントごとに1回**あなたのステートメントが複数の行を削除した場合) –

+0

@marc_s - システムでは、一度に1行しか削除されない可能性があります(アプリケーションフロントエンド)。あなたは何を意味するかを詳しく説明できますか? 'WHERE id = deleted.id'を' WHERE id IN(SELECT id FROM deleted) 'に変更するのは簡単ですか? –

+2

@ShawnH。はい、それは簡単なはずです。私は、Marcは何とか大量削除が呼び出された場合、トリガーは行ごとではなく文全体に対して1回だけ起動するため、INを使用するといずれかの方法でソートする必要があります。 – Bridge

答えて

49
CREATE TRIGGER sampleTrigger 
    ON database1.dbo.table1 
    FOR DELETE 
AS 
    DELETE FROM database2.dbo.table2 
    WHERE bar = 4 AND ID IN(SELECT deleted.id FROM deleted) 
GO 
+0

ありがとうございます。これははるかに簡単で、魅力のように機能します。 –

2

INSERTEDDELETEDは、仮想テーブルです。それらはFROM句で使用する必要があります。

CREATE TRIGGER sampleTrigger 
    ON database1.dbo.table1 
    FOR DELETE 
AS 
    IF EXISTS (SELECT foo 
       FROM database2.dbo.table2 
       WHERE id IN (SELECT deleted.id FROM deleted) 
       AND bar = 4) 
8

使用することをお勧め:

DELETE tbl FROM tbl INNER JOIN deleted ON tbl.key=deleted.key 
1

私はあなたが必要とするため、null値the behavior is differentを意味し、いくつかのシナリオで代わりinexistsの使用を提案し、その

CREATE TRIGGER sampleTrigger 
    ON database1.dbo.table1 
    FOR DELETE 
AS 
    DELETE FROM database2.dbo.table2 childTable 
    WHERE bar = 4 AND exists (SELECT id FROM deleted where deleted.id = childTable.id) 
GO