SQL

2022_11_28 SQL TRIGGER

0304호 2022. 11. 28. 11:36
/*
trigger 는 테이블에 부적한 형태로써 insert, update, delete작업이 수행될 때 특정 코드가 작동되도록 하는 구문입니다.
트리거는 실행할 때 범위를 지정하고 F5버튼으로 부분실행해야 한다.
그렇지 않으면 하나의 구문으로 인식되어 정상동작하지 않습니ㅏㄷ.
*/

CREATE TABLE tbl_test (
    id NUMBER  (10),
    text VARCHAR2(20)
);


set SERVEROUTPUT on;

/*
CREATE OR REPLACE TRIGGER trg_test 
    AFTER UPDATE OR DELETE      --삭제, 수정 이후에 동작
    ON tbl_test                 --부착할 테이블
    FOR EACH ROW                --각행에 적용
DECLARE
    
BEGIN
    DBMS_OUTPUT.PUT_LINE('트리거가 동작함');
    
END;

*/


INSERT INTO tbl_test VALUES(1,'홍길동');
INSERT INTO tbl_test VALUES(2,'이순신');
UPDATE tbl_test SET TEXT = '홍길동' WHERE id=1;
DELETE FROM tbl_test WHERE id=2; 

---
--BEFORE VS AFTER  
/*
AFTER트리거 - INSERT, UPDATE, DELETE 작업 이후에 동작하는 트리거를 의미함
BEFORE트리거 - INSERT, UPDATE, DELETE 작업 이전에 동작하는 트리거를 의미함

:OLD = 참조 전 열의값 ( INSERT : 입력 전 자료, UPDATE: 수정 전 자료, DELETE 삭제 할 자료)
:NEW = 참조 후 열의 값 ( INSERT : 입력 후 자료, UPDATE: 수정 후 자료)
*/

CREATE TABLE tbl_user_backup(
    id VARCHAR2(20),
    name VARCHAR2(20),
    address VARCHAR2(30),
    updatedate DATE DEFAULT sysdate,
    m_type CHAR(10),        --변경 타입
    m_user VARCHAR2(20)     --변경한 사용자
);

CREATE TABLE tbl_user(
    id VARCHAR2(20) PRIMARY KEY,
    name VARCHAR2(20),
    address VARCHAR2(30)
);

--UPDATE 나 DELETE 를 시도하면 수정 또는 삭제된 데이터를 별도의 테이블에 보관

CREATE OR REPLACE TRIGGER trg_user_backup
    AFTER UPDATE OR DELETE
    ON tbl_user
    FOR EACH ROW
DECLARE         --변수 선언
    vn_type VARCHAR2(10);
BEGIN
    
    IF updating THEN        --업데이트 OR 삭제
        vn_type :='수정';
    ELSIF deleting THEN
        vn_type :='삭제';
    END IF;
    
    --USER BACKUP에 INSERT
    INSERT INTO tbl_user_backup VALUES(:OLD.id, :OLD.name, :OLD.address, sysdate, vn_type, user() );



END;


INSERT INTO tbl_user VALUES( 'TEST01', 'ADMIN', '서울');
INSERT INTO tbl_user VALUES( 'TEST02', 'ADMIN', '경기');
INSERT INTO tbl_user VALUES( 'TEST03', 'ADMIN', '부산');
UPDATE tbl_user SET address = '부산' WHERE id = 'TEST01';
DELETE FROM tbl_user WHERE id = 'TEST02';


SELECT * FROM tbl_user_backup;

------------------------------------------------------------------------------
--BEFORE

CREATE OR REPLACE TRIGGER trg_user_insert
    BEFORE INSERT
    ON tbl_user
    FOR EACH ROW
DECLARE
    
BEGIN
    :NEW.name := substr(:NEW.name,1,1) || '**';     --입력전 데이터 ** 붙임
END;

INSERT INTO tbl_user VALUES( 'TEST04', 'ADMIN', '부산');
INSERT INTO tbl_user VALUES( 'TEST05', 'ADMIN', '경기');

SELECT * FROM tbl_user;