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) 궁금합니다