2014-11-02 2 views
0

에 열을 업데이 트 나는 다음 트리거가 있습니다SQL Server는 트리거

ALTER trigger [dbo].[tr_test] 
ON [dbo].[customers] 
for insert, update, delete 
as 
    IF (@@ROWCOUNT = 0) return 
    SET NOCOUNT ON 

    SELECT * 
    FROM INSERTED I JOIN DELETED D 
    ON I.id_no = D.id_no 
     AND EXISTS (SELECT I.* 
        EXCEPT 
        SELECT D.*) 

이 트리거가 조인을 반환하고 분명 심지어 모든 테이블의 열을 변경하지 않은 자들을 포함한다.

변경되지 않은 열을 필터링하여 실제로 변경된 열만 반환 할 수 있습니까? this-

CREATE trigger [dbo].[tr_test] 
 
ON [dbo].[Grades] 
 
for insert, update, delete 
 
as 
 
    IF (@@ROWCOUNT = 0) return 
 
    SET NOCOUNT ON 
 
    
 
create tablae #inserted (...) 
 
    insert into #inserted 
 
    SELECT * 
 
    from INSERTED 
 
create tablae #deleted (...) 
 
    insert into #deleted 
 
    SELECT * 
 
    from deleted 
 
같은

+0

SELECT * FROM #inserted WHERE NOT EXISTS (SELECT * from #deleted)
를 사용 그것을 올바르게 읽는다. 행이 삽입되면 _deleted_에 존재하지 않고 조인에 의해 필터링됩니다. 행이 갱신되면 _inserted_ 및 _deleted_에 존재하지만 existing 술어에 의해 집합에서 제거됩니다. 행이 삭제되면 _inserted_에 존재하지 않고 조인에 의해 필터링됩니다. 그래서 select는 어떤 행도 반환 할 수 없습니까? – jpw

+0

어쨌든 [UPDATED()] (http://msdn.microsoft.com/en-us/library/ms187326.aspx) 및 [COLUMNS_UPDATED()] (http://msdn.microsoft.com/ko-kr/default.asp)를 사용할 수 있습니다. en-us/library/ms186329.aspx) 하나 이상의 (후자의 경우) 열이 변경되었는지 확인하십시오. 내가 아는 한 변경된 열의 목록을 얻을 수는 없으므로 관심있는 각 열을 테스트해야합니다. 그러나 트리거 관련 지식은 약간 제한되어 있습니다. – jpw

+0

@jpw 이러한 함수는 열이 SET 목록의 일부인지 여부 만 알려줍니다. 결과적으로 열 값이 실제로 변경된 경우 사용자에게 알려주지 않습니다. –

답변

-1

시도 뭔가

는이 스크립트 나 '경우 SELECT 문에있는 당신의 논리에 결함이 보인다

+0

이 대답이 유용하지 않은 이유를 알고 싶습니다. –

+0

트리거가 레코드를 반환하지 않습니다. –