본문 바로가기
SQL

SQL - 트리거

by hyeon1016 2024. 11. 11.

트리거

트리거는 총의 방아쇠를 당기면 자동으로 총알이 나가듯이 INSERT, UPDATE, DELETE 문이 작동할 때 실행되는 기능으로 데이터를 삭제할 때 해당 데이터를 다른 테이블에 백업한 후에 삭제하는 기능을 사용할 수 있다.

이러한 트리거 기능은 백업하지 않고 바로 지워버리는 등의 실수를 방지할 수 있고 데이터의 오류가 발생되는 것을 막을 수 있다. 이런 방법으로 데이터의 무결성을 유지할 수 있다.

 

기본 작동

트리거는 DML의 이벤트가 발생할 때 작동한다. 테이블에 미리 부착되는 코드라 생각하면 된다.

트리거는 스토어드 프로시저와 문법이 비슷하지만 CALL문으로 호출할 수 없고 DML의 이벤트가 발생할 때만 자동으로 실행된다. 추가적으로 트리거에는 IN, OUT 매개 변수를 사용할 수 없다.

 

트리거 부착

AFTER ~ : 트리거가 특정 이벤트(INSERT, UPDATE, DELETE) 후에 실행될 수 있게 설정환다.

ON ~ : 트리거가 작동할 테이블을 설정한다.

FOR EACH ROW :  트리거가 작동할 때 각 행마다 적용한다.

*동일한 기능을 하는 구문을 사용해도 ALTER로 지정한 이벤트에서만 트리거가 작동한다.

CREATE TABLE IF NOT EXISTS trigger_table(
    id INT,
    txt VARCHAR(10)
);
INSERT INTO trigger_table VALUES(1, '레드벨벳'); 
INSERT INTO trigger_table VALUES(2, '잇지'); 
INSERT INTO trigger_table VALUES(3, '블랙핑크'); 
SELECT * FROM trigger_table;

-- TRIGGER --

DELIMITER $$
CREATE TRIGGER myTrigger
    AFTER DELETE
    ON trigger_table
    FOR EACH ROW
BEGIN
    SET @msg = '가수 그룹이 삭제됨';
END $$
DELIMITER ;

 

- 트리거의 이름을 myTrigger로 지정한다.

- AFTER DELETE로 DELETE문 이후에 작동하라는 구문을 작성한다.

- ON myTrigger로 트리거를 부착할 테이블을 지정한다.

- FOR EACH ROW는 각 행마다 적용시킨다는 의미이다.

 

OLD, NEW 테이블

OLD : 트리거가 실행되기 전의 컬럼 데이터를 참조한다. UPDATE, DELETE에 사용한다.

NEW : 트리거가 실행된 후의 컬럼 데이터를 참조한다. INSERT, UPDATE에 사용한다.

* UPDATE에 OLD를 사용하면 업데이트 전의 컬럼 데이터를 가져오고, NEW를 사용하면 업데이트 후의 데이터를 가져온다.

CREATE TABLE singer(SELECT mem_id, mem_name, mem_number, addr FROM member);

CREATE TABLE backup_singer(
    mem_id CHAR(8) NOT NULL,
    mem_name VARCHAR(10) NOT NULL,
    mem_number INT NOT NULL,
    addr CHAR(2) NOT NULL,
    modType CHAR(2),
    modDate DATE,
    modUser VARCHAR(30)
);

 

- 일반적인 테이블과 백업 테이블을 생성한다. 백업 테이블은 변경타입, 시간, 유저 테이블을 추가적으로 생성한다.

 

DELIMITER $$
CREATE TRIGGER singer_updateTrg
    AFTER UPDATE
    ON singer
    FOR EACH ROW
BEGIN
    INSERT INTO backup_singer VALUES(OLD.mem_id, OLD.mem_name, OLD.mem_number, OLD.addr, '수정', CURDATE(), CURRENT_USER());
END $$
DELIMITER ;

DELIMITER $$
CREATE TRIGGER singer_deleteTrg
    AFTER DELETE
    ON singer
    FOR EACH ROW
BEGIN
    INSERT INTO backup_singer VALUES(OLD.mem_id, OLD.mem_name, OLD.mem_number, OLD.addr, '삭제', CURDATE(), CURRENT_USER());
END $$
DELIMITER ;

DELIMITER $$
CREATE TRIGGER singer_insertTrg
    AFTER INSERT
    ON singer
    FOR EACH ROW
BEGIN
    INSERT INTO backup_singer VALUES(NEW.mem_id, NEW.mem_name, NEW.mem_number, NEW.addr, '추가', CURDATE(), CURRENT_USER());
END $$
DELIMITER ;

 

- ALTER 명령어로 INSERT, UPDATE, DELETE시에 작동할 트리거를 작성한다.

- UPDATE와 DELETE에는 OLD테이블을 INSERT에는 NEW 테이블을 추가하는 구문을 작성한다.

 

INSERT INTO singer (SELECT mem_id, mem_name, mem_number, addr FROM member WHERE mem_id='BLK');
UPDATE singer SET addr='영국' WHERE mem_id='BLK';
DELETE FROM singer WHERE mem_number >= 7;

 

- 결과를 확인한다.

 

'SQL' 카테고리의 다른 글

SQL - 프로그래밍  (0) 2024.11.08
SQL - 제약조건  (1) 2024.11.07
SQL - 뷰(VIEW)  (0) 2024.11.07
SQL - JOIN  (0) 2024.11.07
SQL - 데이터의 형식  (0) 2024.11.06