web-dev-qa-db-fra.com

Déclencheur SQL Server ON DELETE

J'essaie de créer un déclencheur de base de données qui supprime conditionnellement des lignes de database1.table1 lorsqu'une ligne de database2.table2 est supprimée. Je suis nouveau dans les déclencheurs et j'espérais apprendre la meilleure façon d'y parvenir. C'est ce que j'ai jusqu'à présent. Suggestions?

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

Mieux utiliser:

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

INSERTED et DELETED sont des tables virtuelles. Ils doivent être utilisés dans une clause 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

Je suggérerais l'utilisation de exists au lieu de in car dans certains scénarios cela implique des valeurs nulles le comportement est différent , donc

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