트리거1
BEGIN TRY
BEGIN TRAN
--INSERT INTO SMS_MSG(STATUS, SENDER, RECEIVER, MSG, RESERVEDT ,USERID, SMSFLAG) VALUES(0, '11', '123', 'ASDSA' , @ST_ID , GETDATE() , 1)
IF @RESULT_FLAG='F' --실패면 실패로그 테이블에 담아둔다..
BEGIN
INSERT INTO ST_AUTH_FAIL(ST_ID, ST_AUTHID, SC_CODE, FAIL_MSG, REGDATE,IP)
VALUES(@ST_ID, @ST_AUTHID, @SC_CODE, @RESULT_MSG, GETDATE(), @IP);
END
ELSE
BEGIN
INSERT INTO ST_AUTH_LOG(ST_AUTHID, SC_CODE, AUTH_TIME, MSG_FLAG, MANU_FLAG,IP)
VALUES(@ST_AUTHID, @SC_CODE, @AUTH_TIME, @MSG_FLAG, @MANU_FLAG, @IP)
--- ST_AUTH_LOG 에 데이터가 들어가는 순간 트리거2 가 작동 --
END
COMMIT TRAN
--RETURN
END TRY
BEGIN CATCH
ROLLBACK TRAN
INSERT INTO ST_ERROR_LOG(ERROR_NUMBER, ERROR_PROCEDURE, ERROR_LINE ,ERROR_MSG, ERROR_STATE, ERROR_DATE, ST_ID, SC_CODE)
SELECT ERROR_NUMBER(), ERROR_PROCEDURE(), ERROR_LINE(), ERROR_MESSAGE(), ERROR_STATE(), getdate(), @ST_ID, @SC_CODE
END CATCH
트리거2
BEGIN TRY
BEGIN TRAN
IF @CHECK_MSG = '등원' OR @CHECK_MSG = '지각'
BEGIN
/*
PRINT 'CHECK_MSG=' + @CHECK_MSG +'\n'
PRINT 'ST_ID=' + @ST_ID +'\n'
PRINT 'SC_CODE=' + @SC_CODE +'\n'
*/
UPDATE ST_CHECK_DATE SET
IN_CHECK = CONVERT(VARCHAR(5),@AUTH_TIME,8),
IN_CHECK_MSG = @CHECK_MSG
WHERE ST_ID = @ST_ID AND SC_CODE = @SC_CODE
END
ELSE -- 하원
BEGIN
UPDATE ST_CHECK_DATE SET
OUT_CHECK = CONVERT(VARCHAR(5),@AUTH_TIME,8),
OUT_CHECK_MSG = @CHECK_MSG
WHERE ST_ID = @ST_ID AND SC_CODE = @SC_CODE
END
--메시지 테이블에 담기
PRINT 1/0 --고의로 에러를 냄
INSERT INTO SMS_MSG(STATUS, SENDER, RECEIVER, MSG, RESERVEDT ,USERID, CREATEDT, SMSFLAG) VALUES(0, @SC_TEL, @ST_PPHONE, @RESULT_MSG , GETDATE() , @ST_ID , GETDATE() , @SMSFLAG)
COMMIT TRAN
-- RETURN
END TRY
BEGIN CATCH
ROLLBACK TRAN
INSERT INTO ST_ERROR_LOG(ERROR_NUMBER, ERROR_PROCEDURE, ERROR_LINE ,ERROR_MSG, ERROR_STATE, ERROR_DATE, ST_ID, SC_CODE)
SELECT ERROR_NUMBER(), ERROR_PROCEDURE(), ERROR_LINE(), ERROR_MESSAGE(), ERROR_STATE(), getdate(), @ST_ID, @SC_CODE
END CATCH
이런식으로 개발이 되어있는데요 질문의 요지는 트리거2 에서 에러가 나면
ROLLBACK TRANSACTION 요청에 해당하는 BEGIN TRANSACTION이 없습니다.
이런 에러가 자꾸 뜹니다 인터넷을 좀 찾아 봤는데 트리거2가 자식 프로 시저닌깐 롤백이되면 부모(트리거1)에서 에러처리를
하는 부분에서 @@TRANCOUNT 카운트가 0 이닌깐 처리할 트랜잭션이 없어서 없어서 에러가 나는거 가튼데
해결방법을 못찾았습니다 ㅜ 선배님들 조언좀 해주시면 정말 감사드리겠습니다 ㅜ
Comment 7
-
폭주
2013.11.15 10:08
-
alima
2013.11.15 10:09
이부분을 어디에 넣어야 되나요?
트리거1에 넣나요?
-
alima
2013.11.15 10:13
혹시나 몰라서 트리거1 부분에 넣었는데요 에러부분이 정상적이라면
0으로 나누기 오류가 발생했습니다. 라고 오류메시지가 담겨야되는데
트리거가 발생하여 트랜잭션이 종료되었습니다. 일괄 처리가 중단되었습니다.
이게 오류메시가 담기네요,,, 허허 ...
-
폭주
2013.11.15 15:53
둘다 담기지 안나요?
제가 테스트 해본 결과 2번째 트리거에 오류 로그에 저장 되고
1번째 트리거의 인써트문에서 오류 발생 한 내역 오류 로그 테이블에 저장 되는데요
또한 두개의 로그가 쓰여지는것이 문제라면
IF @@TRANCOUNT >0
BEGIN
ROLLBACK TRANINSERT INTO ST_ERROR_LOG(ERROR_NUMBER, ERROR_PROCEDURE, ERROR_LINE ,ERROR_MSG, ERROR_STATE, ERROR_DATE, ST_ID, SC_CODE)
SELECT ERROR_NUMBER(), ERROR_PROCEDURE(), ERROR_LINE(), ERROR_MESSAGE(), ERROR_STATE(), getdate(), @ST_ID, @SC_CODE
ENDCATCH 절 에 모두 @@TRANCOUNT 체크하여 롤백 하시면 됩니다.
COMMIT TRAN 또한 마찬가지로 @@TRANCOUNT 로 체크 하시면 됩니다.
-
건우아빠
2013.11.15 10:54
테이블 트리거안에서 begin tran 보다는 앞단 테이블에 묶어 주시고 트리거 안에서는 에러처리를 하시는게
좋을듯 합니다.
UPDATE ....
IF @@ERROR != 0 GOTO TRIGGER_ERROR
GOTO TRIGGER_END
TRIGGER_ERROR:
RAISERROR (UPDATE 실패!', 16, -1)
TRIGGER_END:END
-
alima
2013.11.15 15:13
소중한 답변들 너무 감사드립니다 ㅎ 많은 도움이 됐습니다.
-
건우아빠
2013.11.15 15:23
SAVE TRANSACTION 란 기능도 참고해보세요..
http://stackoverflow.com/questions/884334/tsql-try-catch-transaction-in-trigger
IF @@TRANCOUNT !=0
ROLLBACK TRANSACTION