Подтвердить что ты не робот

SQL Server ON DELETE Trigger

Я пытаюсь создать базовый триггер базы данных, который условно удаляет строки из базы данных1.table1, когда строка из базы данных2.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
4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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)

Ответ 4

Я бы предложил использовать 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