패스트캠퍼스 백엔드 부트캠프 3기/database

[database] 트리거 (Trigger) 생성 오류 해결 및 메시지 출력

hail2y 2025. 2. 8. 13:13

트리거 (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; -- 메시지 출력하기 위해서 밖에서 적어주어야 한다

출력 메시지 확인 방법 - chatGPT

그러면 지정한 메시지가 잘 출력된 걸 확인할 수 있다. 마지막 사진은 트리거 실행 결과인데 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