Триггер SQL Server ON DELETE - PullRequest
       29

Триггер SQL Server ON DELETE

21 голосов
/ 03 апреля 2012

Я пытаюсь создать базовый триггер базы данных, который условно удаляет строки из database1.table1 при удалении строки из database2.table2. Я новичок в триггерах и надеялся узнать лучший способ сделать это. Это то, что я до сих пор. Предложения?

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 ]

58 голосов
/ 03 апреля 2012
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
8 голосов
/ 28 ноября 2013

Лучше использовать:

DELETE tbl FROM tbl INNER JOIN deleted ON tbl.key=deleted.key
2 голосов
/ 03 апреля 2012

INSERTED и DELETED - виртуальные таблицы.Их нужно использовать в предложении 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)
1 голос
/ 14 февраля 2014

Я бы предложил использовать exists вместо in, потому что в некоторых сценариях, которые подразумевают нулевые значения , поведение отличается , поэтому

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
...