web-dev-qa-db-ja.com

SQL Server ON DELETEトリガー

Database2.table2の行が削除されると、database1.table1から行を条件付きで削除する基本的なデータベーストリガーを作成しようとしています。私はトリガーが初めてで、これを達成するための最良の方法を学びたいと思っていました。これは私がこれまで持っているものです。提案?

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
21
Shawn H.
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
58
Magnus

使用する方が良い:

DELETE tbl FROM tbl INNER JOIN deleted ON tbl.key=deleted.key
8
Scott Rayner

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)
2
Anthony Faull

existsの代わりにinを使用することをお勧めします。これは、いくつかのシナリオではnull値を意味するためです 動作が異なる

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
1
Narkha