트리거 (Trigger)
- 사용자가 호출하는 것이 아니고 어떤 테이블에 특정한 DML 문이 수행되었을 때 데이터베이스에서 자동적으로 동작하도록 작성된 프로그램
- 타이밍에 따른 분류
- DML 이전에 수행 BEFORE TRIGGER
- DML 이후에 수행 AFTER TRIGGER - 수행 차수에 따른 분류
- 한 번만 수행 STATEMENT TRIGGER
- 행 마다 수행 ROW TRIGGER
CREATE OR REPLACE TRIGGER tg_show_plan
AFTER INSERT ON temp
--REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('트리거가 작동했습니다.');
INSERT INTO temp_tg_test (name, salary)
VALUES (CONCAT(:NEW.name, :NEW.salary), 9999999);
END;
/
-- '/' 안 쓰고 이후 코드 실행하면 단축키로 한줄 실행 시 오류 남
트리거 문을 잘 생성하면 출력 화면에서 'Trigger [트리거명]이(가) 컴파일되었습니다.' 라는 문구가 나온다. 하지만 왜인지 모르게 이후의 코드를 실행하면 'ctrl + enter' 단축키로 한 줄 단위의 실행이 되지 않고 트리거에 오류가 생겼다. (범위 지정은 가능) 즉 트리거가 만들어졌지만 직후에 오류가 생기면서 DML 문도 실행하지 못 하게 된 것이다.
나는 그 다음 코드가 SELECT 문이었는데 다음과 같은 오류가 난 것이다. PL/SQL에서는 SELECT를 직접 사용할 수 없어서 SELECT ... INTO 문을 대체 사용하고 있었고 이것은 SELECT 결과를 미리 선언한 변수에 저장하는 쿼리이다. :NEW, :OLD로 처리하는 것이 일반적인 방법이라고 한다. (chatGPT 참고)

트리거를 생성한 후 관련된 정보를 보고 싶다면 아래 명령어를 입력해 보면 된다. 트리거 정보는 user_triggers에서, 오류기 났다면 user_errors에서 확인해 볼 수 있다.
SELECT * FROM user_triggers;
SELECT * FROM user_errors WHERE name = '[트리거명]';
그렇기 때문에 위의 CREATE TRIGGER 문에서 '/'를 삽입해 주었다. 그러면 잘 실행된다.


그리고 트리거 내용을 다룬 블로그들을 찾아보다가 출력 화면에서 메시지를 출력하는 방법을 알게 되었다. BEGIN-END 문 사이에 넣어주면 되고 해당 문구를 보이게 하기 위해서는 'SET SERVEROUTPUT ON' 문이 별도로 필요했다.
DBMS_OUTPUT.PUT_LINE('트리거가 작동했습니다.');
SET SERVEROUTPUT ON; -- 메시지 출력하기 위해서 밖에서 적어주어야 한다

그러면 지정한 메시지가 잘 출력된 걸 확인할 수 있다. 마지막 사진은 트리거 실행 결과인데 temp_tg_test 테이블에 새로운 row에 대한 내용이 잘 insert 된 모습이다.


[참고:https://blog.naver.com/chas0302/221890879467, https://blog.naver.com/ldh-lsy/220915101438 ]
『PLSQLº』 오라클 트리거(AFTER TRIGGER, :OLD, :NEW)
▶ 오늘의 주제 : 오라클 트리거 개념과 사용법 ▶ Intro (주제와 관계없는 내용이니 누구보다 빠르게 Sk...
blog.naver.com
(Oracle)오라클 트리거. TRIGGER 생성. AFTER BEFORE.
(Oracle)오라클 트리거. TRIGGER 생성. AFTER BEFORE. 오라클 트리거 생성 예제 ( Tib...
blog.naver.com
'패스트캠퍼스 백엔드 부트캠프 3기 > database' 카테고리의 다른 글
[database] 오라클 코멘트 설정 및 조회 (0) | 2025.02.10 |
---|---|
[database] Transaction Control, Dictionary (0) | 2025.02.10 |
[database] 데이터베이스 목차 정리 (0) | 2025.02.07 |
[database] Oracle에서 Index Range Scan 확인하기, 쿼리 간 비교 (0) | 2025.02.06 |
[database] Constraint (0) | 2025.02.03 |