2012-04-03 5 views
19

database2.table2의 행이 삭제 될 때 database1.table1에서 조건부로 행을 삭제하는 기본 데이터베이스 트리거를 만들려고합니다. 나는 트리거가 생소하고 이것을 달성하기위한 최선의 방법을 배우기를 희망했다. 이것은 내가 지금까지 가지고있는 것이다. 제안?SQL Server ON DELETE 트리거

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

당신이 필요로하는 방아쇠가 발동되었다는 사실을 고려 ** ** 문당 한 번 ** (그리고 ** NOT ** once pe (행이 많은 행을 삭제 한 경우) –

+0

@marc_s - 시스템에서 한 번에 하나의 행만 삭제 될 수 있음을 알 수 있습니다. 응용 프로그램 프런트 엔드). 무슨 뜻인지 자세히 설명해 주시겠습니까? 'WHERE id = deleted.id'를'WHERE id IN (SELECT id FROM deleted)'로 변경하는 것만 큼 간단합니까? –

+2

@ShawnH. 네, 그렇게 간단해야합니다. 나는 어떻게 든 방아쇠가 행마다가 아니라 전체 문에 대해 한 번만 실행되므로 어쨌든 대량 삭제가 호출되면 Marc이 의미한다고 생각합니다. 따라서 IN을 사용하면 어느 방향 으로든 정렬해야합니다. – Bridge

답변

49
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 
+0

감사합니다. 이것은 훨씬 더 간단하고 매력처럼 작동합니다. –

2

INSERTEDDELETED 가상 테이블입니다. 그들은 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) 
8

사용하기 :

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

내가 exists 대신 in의 사용을 제안하기 때문에 null 값 the behavior is different을 의미 일부 시나리오에서, 그래서

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