Ответ 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
Я пытаюсь создать базовый триггер базы данных, который условно удаляет строки из базы данных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
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
Лучше использовать:
DELETE tbl FROM tbl INNER JOIN deleted ON tbl.key=deleted.key
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)
Я бы предложил использовать 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