본문 바로가기

커맨드 명령

2.3.14 CREATE TRIGGER



트리거 생성


/* 문법 */
CREATE [OR REPLACE] TRIGGER trigger_name
timing event ON table_name statement
 
CREATE TRIGGER trigger_name ON table_name
FOR event AS statement
 
 
/* 파라미터 */
trigger_name                -- 생성할 트리거 이름
timing_BEFORE/AFTER            -- 트리거 처리를 실행할 타이밍
event..INSERT/UPDATE/DELETE    
table_name                    -- 트리거의 대상이 되는 테이블 이름
statement                    -- 실행될 문장
cs

『CREATE TRIGGER』를 사용하면, 트리거를 생성할 수 있다.

Oracle의 경우, CREATE TRIGGER 다음에 생성하고 싶은 트리거 이름을 입력한 후 『timing』을 

실행하여 조작 전에 실행할 것인지 나중에 실행할 것인지를 지정한다.



『event』는 시초가 되는 명령(INSERT, UDATE, DELETE)을 결정한다.

ON 다음에 트리거를 생성할 테이블 이름을 입력한다. 마지막으로, 실행할 SQL문장을 입력한다.


프로시저와 동일하게 제어 명령을 입력할 수도 있다.


/* 사용 예 */
CREATE OR REPLACE TRIGGER trg_insert_foo AFTER INSERT ON foo
--테이블 foo에 행이 INSERT될 때마다 실행될 명령
INSERT INTO foo_history VALUES('insert',SYSDATE)
cs

SQL Server이 경우, CREATE TRIGGER 다음에 생성하고 싶은 트리거 이름을 지정한다.

그리고 ON을 입력한 후, 그 뒤에 트리거를 생성할 테이블 이름을 입력한다.

이어서 FOR 『event』를 지정하고, 마지막으로 AS뒤에 실행할 SQL문장을 입력한다. 

프로시저와 동일하게 제어 명령을 입력할 수 있다.



/* 사용 예 */
CREATE TRIGGER trg_insert_foo ON foo FOR INSERT AS
--테이블 foo에 행이 INSERT될 때마다 실행될 명령
INSERT INTO foo_history VALUES ('insert',GETDATE())
cs

트리거 안의 문장에서는 트리거가 호출된 상황(INSERT라면 어떤 데이터행이 추가되었을까)을 

참조할 수 있다.


Oracle의 경우 『FOR EACH ROW』를 지정하여 변화할 상황을 한 행씩 처리해 나간다.

『:new』, 『:old』는 트리거의 기원이 된 테이블과 같은 열을 가진 유사한 객체이다.

INSERT 트리거의 경우, :new 만 참조할 수 있다. DELETE 트리거의 경우는 :old만을 참조할 수 있다.


UPDATE 트리거는 :new, :old 를 모두 참조할 수 있다.



/* 사용 예 */
CREATE OR REPLACE TRIGGER trg_insert_foo AFTER INSERT ON foo
    FOR EACH ROW
    BEGIN
        INSERT INTO foo_history VALUES(:new.a    'inserted', SYSDATE);
    END;
 
CREATE OR REPLACE TRIGGERtrg_delete_foo AFTER DELETE ON foo
    FOR EACH ROW
    BEGIN
        INSERT INTO foo_history VALUES (:old.a 'deleted', SYSDATE);
    END;
cs

SQL Server에서는 『inserted』,『deleted』라고 하는 유사 테이블을 참조할 수 있다.

여기에는 추가된 데이터행과 삭제된 데이터행이 들어 있다.




/* 사용 예 */
CREATE TRIGGER trg_insert_foo ON foo FOR INSERT AS
    INSERT INTO foo_history
        SELECT CONVERT(VARCHAR, a) + 'inserted', GETDATE()
        FROM inserted
 
CREATE TRIGGER trg_delete_foo ON foo FOR DELETE AS
    INSERT INTO foo_history
        SELECT DISTINCT CONVERT (VARCHAR, a)+'deleted',GETDATE()
        FROM deleted
cs


'커맨드 명령' 카테고리의 다른 글

2.3.16 CREATE SEQUENCE  (0) 2018.11.21
2.3.15 DROP TRIGGER  (0) 2018.11.21
2.3.13 DROP FUNCTION  (0) 2018.11.13
2.3.12 CREATE FUNCTION  (0) 2018.11.13
2.3.11 DROP PROCEDURE  (0) 2018.11.12