트리거는 자동으로 수행하여 사용자가 추가 작업을 잊어버리는 실수를 방지함.
트리거를 사용하면, 데이터에 오류가 발생하는 것을 막을 수 있고, 이런 것을 데이터의 무결성이라고 부름.
INSERT, UPDATE, DELETE를 실행하면 트리거를 자동으로 작동함.
트리거란 테이블에서 DML 문(INSERT, UPDATE, DELETE 등의 이벤트)이 발생하면 실행되는 코드임.
트리거는 스토어드 프로시저와 문법이 비슷하지만, CALL 문으로 직접 실행시킬 수는 없고 어직 테이블에 DML 등의 이벤트가 발생할 경우에만 자동으로 실행됨.
스토어드 프로시저와 달리 IN, OUT 매개변수를 사용할 수 없음.


트리거 이름을 myTrigger로 지정함.
AFTER DELETE는 이 트리거를 DELETE 문이 발생된 이후에 작동하라는 의미임.
이 트리거를 부착할 테이블을 지정함 (trigger_table)
FOR EACH ROW는 각 행마다 적용시킨다는 의미인데, 트리거에는 항상 써준다고 보면 됨.
BEGIN ~ END $$는 트리거에서 실제로 작동할 부분임. 지금은 간단히 @msg 변수에 글자를 대입시켜 놓음.
@msg 변수에 빈 문자를 넣고 INSERT 문을 실행함.

코드 설명
결과를 보면 아무것도 나오지 않음.
이는 trigger_table에는 DELETE에만 작동하는 트리거를 부착시켜 놓았기 때문임.
DELETE 문을 테이블에 적용함.

트리거는 테이블에 입력/ 수정/ 삭제되는 정보를 백업하는 용도로 활용 가능
가수 테이블에 INSERT나 UPDATE 작업이 일어나는 경우, 변경되기 전의 데이터를 저장할 백업 테이블을 미리 생성함.

백업 테이블에는 추가로 수정 또는 삭제인지 구분할 변경된 타입(modType), 변경될 날짜(modDate), 변경한 사용자(modUser)를 추가함.

변경(UPDATE)이 발생할 때 작동하는 트리거를 singer 테이블에 부착하기

코드 설명
OLD 테이블은 UPDATE나 DELETE가 수행될 때, 변경되기 전의 데이터가 잠깐 저장되는 임시 테이블임.
OLD 테이블에 UPDATE 문이 작동되면 INSERT ~~ 행에 의해서 업데이트되기 전의 데이터가 백업 테이블에 입력됨. 즉, 원래 데이터가 보존됨.
CURDATE()는 현재 날짜를, CURRENT_USER()는 현재 작업 중인 사용자를 알려줌.
삭제(DELETE)가 발생했을 때 작동하는 singer_deleteTrg 트리거 생성하기

코드 설명
데이터 변경하기 -> 한 건의 데이터를 업데이트하고, 여러 건을 삭제하기


이번에는 테이블의 모든 행 삭제하기

DELETE 대신에 TRUNCATE TABLE 문으로 삭제함.
백업 테이블에는 삭제된 내용이 들어가지 않음. 그 이유는 DELETE 트리거는 오직 DELETE 문에만 작동하기 때문임.
테이블에 INSERT, UPDATE, DELETE 작업이 수행되면 임시로 사용되는 시스템 NEW와 OLD가 있음.
NEW 테이블

지금까지 배운 바로는 INSERT(새 값) 형태로 테이블에 새 값이 바로 들어감.
그러나, 사실 새 값은 테이블에 들어가기 전에 NEW 테이블에 잠깐 들어가 있음.
OLD 테이블

삭제될 예전 값이 삭제되기 전에 OLD 테이블에 잠깐 들어가 있음.
그래서 AFTER DELETE 트리거를 만들어도 삭제된 후에 OLD.열 이름 형식으로 예전 값에 접근할 수 있었던 것.
UPDATE(새 값, 예전 값)을 사용하면, NEW 테이블과 OLD 테이블을 모두 사용함.
