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
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
Mieux utiliser:
DELETE tbl FROM tbl INNER JOIN deleted ON tbl.key=deleted.key
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)
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