MYSQL OLD,NEW임시테이블 내부동작 0 0 454

by 정성수 [MySQL] [2020.01.25 11:30:46]


DROP TRIGGER IF EXISTS userTbl_InsertTrg;

DELIMITER //

CREATE TRIGGER userTbl_InsertTrg

         After UPDATE

         ON userTBL

         FOR EACH ROW

BEGIN

         INSERT INTO backup_userTbl VALUES( OLD.userID, OLD.name, OLD.birthYear,

             OLD.addr, OLD.mobile1, OLD.mobile2, OLD.height, OLD.mdate,

                '삭제', CURDATE(), CURRENT_USER()  );

                 

          SIGNAL SQLSTATE '45000'

SET MESSAGE_TEXT = '데이터의 입력을 시도했습니다. 귀하의 정보가 서버에 기록되었습니다.';

END //

DELIMITER ;

 

이구문에 관해서 질문드려요

그리고 책 내용중에 SIGNAL SQLSTATE '45000'문이 실행되면 오류가 강제로 발생되며

UPDATE는 롤백이 되어 테이블에 적용되지 않는다고 하는 내용과

트리거가 적용된 테이블에 UPDATE문이 실행되면 테이블에 새로 적용시킬 행정보가 NEW임시테이블에 저장되고난후에 userTbl에 행정보를 적용시키는것과

OLD테이블은 적용시키기전 행정보를 저장된다고하는데

이것들에 정확한 순서를 모르겠어서요

 

제가 생각하는 내부동작순서는

 

예)UPDATE INTO userTBL VALUES('ABC', '에비씨', '1977', '서울', '011', '11111111', 181, '2019-12-25');

이런 쿼리문이 실행되면

1.트리거문 실행

2.UPDATE 적용내용을 NEW 임시테이블에 넣고

3.userTbl에 기존 내용을 OLD임시테이블에 넣고

4.BEGIN문 시작

5.INSERT INTO backup_userTbl ........구문으로 백업하고

6.오류문을 발생시키고 롤백시킴

 

이 순서가 맞나요

여기서 더 의문점이 롤백시킨다는건 UPDATE into userTbl구문이 실행되고  NEWtbl내용이

userTbl적용되고 난후에 결과를 OLD임시테이블로 다시 복구시키는지요

정확 순서가 모르곘어요

 

아니면 단순하게 오류문에서 롤백을 시키면 트랜잭션을 취소시키는 구조이고

만약 오류가 발생안시킨다는 전제하에 END문을 만나고 난후에야 그때 userTbl에 해당 수정내용을 적용시키는지(NEW임시테이블→userTbl) 궁금합니다

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입