2012-07-02 3 views
0

Stack에서 몇 가지 질문/답변을 읽었지만 필요한 항목을 찾을 수 없습니다.특정 값의 트리거?

col0 col1 col2 col3 col4 
---- ---- ---- ---- ---- 
8  1  a  b  c 
8  2  a  b  c 
8  3  a  b  c 
9  1  a  b  c 
9  2  a  b  c 

그리고 내 소프트웨어를 수행합니다 :

INSERT INTO testtable ([col0],[col1],[col2],[col3],[col4]) 
    VALUES ('8','4','a','b','c') 

나는이 의사 코드 같은 트리거 만드는 방법 :

On insert when col1 = '4' 
    delete existing rows where col0 is the same (8 in this case) 
    ** except for the new row I've just added ** 

답변

1

트리거 대신이 작업을 수행하는 것이 더 적절한 것으로 들립니다. 목표가 무엇인지 가정하면 : col0 = 8로 새 행을 삽입하면 같은 키를 가진 다른 모든 행을 삭제하겠습니까?

CREATE TRIGGER dbo.testtable_instead_insert 
ON dbo.testtable 
INSTEAD OF INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DELETE t 
    FROM dbo.testtable AS t 
    INNER JOIN inserted AS i 
    ON t.col0 = i.col0 
    WHERE i.col1 = '4'; 

    INSERT dbo.testtable(col0,col1,col2,col3,col4) 
    SELECT col0,col1,col2,col3,col4 
     FROM inserted; 
END 
GO 

삽입이 동일한 col0 값으로 여러 행을 추가하려고하면 어떤 규칙을 따르고 싶은가요? 삽입 문이 다음과 같다고 가정 해보십시오.

INSERT dbo.testtable ([col0],[col1],[col2],[col3],[col4]) 
SELECT '8','4','a','b','c' 
UNION ALL 
SELECT '8','3','c','d','e'; 
+0

나는 정확하게 설명하지 못했다. (죄송합니다 내 영어). 예, 8은 키 값이지만 "표시"는 col1입니다. 같은 키를 사용하여 수십 줄을 삽입 할 수 있지만, 그 줄 중 하나가 col1에서 "4"이면 키가있는 다른 모든 줄이 삭제됩니다 8. –

+0

좋아, 지금 내가 원하는 것만으로 업데이트되었습니다. 그래도 복제본으로 무엇을하고 싶은지 확실하지 않습니다. –

+0

테스트 및 조정 :) thanks –

1

이 시도를
의 나는 다음과 같은 테이블이 있다고 가정 해 봅시다 (테스트 서버에서) :

DELETE FROM TESTTABLE T1 
    JOIN INSERTED T2 
     ON T1.COL1 = T2.COL1 
     AND T1.COL0 = T2.COL0 
+0

하지만 '8'은 고정 값이 아닌 INSERT 문과 함께 삽입됩니다. –

+0

이렇게 (편집 참조)? Col1 및 Col0의 이전 복제본을 삭제하려고합니까? 테스트 테이블에 ID 필드가 있습니까? 나는 내 솔루션이 삽입 된 것을 삭제할 것이라고 걱정하지만, ID 필드가 있다면 "어디서 T1.ID <> T2.ID"라고 말할 수 있습니다. –

+0

예, 방금 삽입 한 것과 같은 col0에 대한 모든 값이 삭제됩니다. 이후 트리거에서이 작업을 수행하는 것은 문제가됩니다. 트리거를 실행 한 삽입에서 어떤 행이 왔는지, 어떤 행이 이미 존재하고 키 열에 동일한 값을 가지고 있는지를 알 수 없기 때문입니다. –

관련 문제