2013-07-24 2 views
0

SQL Server 2008에서는 작성한 응용 프로그램에서 다양한 유형의 로깅을 수행하도록 트리거를 작성해야합니다. 문제는 SQL이 녹슬고 때로는 로깅을하기 위해 트리거에 넣은 것들 중 일부가 예기치 않게 오류가 발생한다는 것입니다. 결국 모든 오류를 해결할 예정이지만 그 동안 트리거 코드가 예기치 않게 실패하면 업데이트를 롤백하거나 응용 프로그램 조각을 깨뜨린 삽입을 삽입하기 때문에 내 트리거 코드가 내 응용 프로그램을 손상시킵니다. 트리거 코드 주위에 try catch 블록을 넣으려고 시도했지만 다른 언어로 사용하는 것에 익숙하지 않은 것으로 나타나고 원래 트랜잭션도 롤백합니다.오류시 원래 트랜잭션이 롤백되지 않도록 SQL 트리거

누군가가 어떻게 알 수 있습니까?/오류가 발생했을 때 트리거가 정상적으로 종료되고 트리거가 완료되도록 트리거를 작성할 수 있습니까?

+1

확인 - http://stackoverflow.com/questions/17722967/how-to-ignoring-errors-in-trigger-and-perform-respective-operation-in-ms-sql-ser/ 17724709 # 17724709 오류가 발생하지 않도록 트리거를 수정하는 것이 더 쉽고 효과적이라고 생각합니다. –

+0

[http://stackoverflow.com/a/2163041/1114171](http://stackoverflow.com/a/2163041/1114171) –

+1

일반적으로 트리거에서 작업을 대기열에 넣은 다음 대기열에있는 작업을 가져 오는 것이 가장 좋습니다 자체 트랜잭션에서 (서비스 브로커, SQL 에이전트 작업 등을 통해) 거기에서부터 진행됩니다. 그러나 그 충고는 당신이 기초를 지나갈 수있는 경우에만 작동합니다. –

답변

2

트리거 본체 코드를 try-catch block으로 묶을 수 있습니다.

CREATE TRIGGER tg 
ON tt 
AFTER DELETE 
AS 
    set xact_abort off; 
    BEGIN TRY 
     sql_statements 
    END TRY 
    BEGIN CATCH 
      dies gracefully 
    END CATCH; 

현재 거래가 자동으로 롤백되지 않도록하려면 xact_abort을 꺼야합니다.

sql fiddle sample

관련 문제