트리거에서 before update와 after update의 차이점이 before는 update 전에 트리거 내용을 실행하고, after는 update를 한 후에 실행된다고 알고 있습니다. 아래 예제를 보시면
예제 1)
SQL> CREATE TABLE Dept
2 ( dept_no NUMBER,
3 dept_name VARCHAR2(10),
4 emp_no NUMBER,
5 CONSTRAINT Dept_pk_DeptNo PRIMARY KEY (dept_no) );
테이블이 생성되었습니다.
SQL>
SQL> -- 예제 테이블로의 데이터 입력
SQL> INSERT INTO Dept VALUES (1, '관리부', 2);
1 개의 행이 만들어졌습니다.
SQL> INSERT INTO Dept VALUES (2, '개발부', 1);
1 개의 행이 만들어졌습니다.
SQL> INSERT INTO Dept VALUES (3, '영업부', 10);
1 개의 행이 만들어졌습니다.
SQL> INSERT INTO Dept VALUES (6, '기획부', 3);
1 개의 행이 만들어졌습니다.
SQL>
SQL> -- dept_before_update 트리거 생성
SQL> CREATE OR REPLACE TRIGGER dept_before_update before
2 UPDATE ON dept
3 FOR EACH ROW
4 BEGIN
5
6 DBMS_OUTPUT.ENABLE;
7
8 DBMS_OUTPUT.PUT_LINE('변경전 컬럼 값: ' || :old.dept_name );
9 DBMS_OUTPUT.PUT_LINE('새로운 컬럼 값: ' || :new.dept_name );
10
11 END;
12 /
트리거가 생성되었습니다.
SQL>
SQL> -- 서버 출력 활성화
SQL> SET ServerOutput ON
SQL>
SQL> -- 데이터 수정 -> 트리거 실행(Trigger Firing)
SQL> UPDATE dept
2 SET dept_name = '계획관리'
3 WHERE dept_no = 6;
변경전 컬럼 값: 기획부
새로운 컬럼 값: 계획관리
1 행이 갱신되었습니다.
이 1번 예제는 update전에 트리거 내용을 먼저 실행하고 '1행이 갱신되었습니다.'라고 나오니까 맞는데요.
아래의 예제2는 before를 after로 바꾼겁니다.
그럼 update 하면, update 쿼리문이 먼저 실행되서
'1행이 갱신되었습니다. ' 이후에 트리거가 실행되서 '변경전~~' 이렇게 결과가 나와야 하는거 아닌가요?
예제2)
SQL> -- AFTER 예제 테이블 생성
SQL> DROP TABLE Dept;
테이블이 삭제되었습니다.
SQL> CREATE TABLE Dept
2 ( dept_no NUMBER,
3 dept_name VARCHAR2(10),
4 emp_no NUMBER,
5 CONSTRAINT Dept_pk_DeptNo PRIMARY KEY (dept_no) );
테이블이 생성되었습니다.
SQL>
SQL> -- 예제 테이블로의 데이터 입력
SQL> INSERT INTO Dept VALUES (1, '관리부', 2);
1 개의 행이 만들어졌습니다.
SQL> INSERT INTO Dept VALUES (2, '개발부', 1);
1 개의 행이 만들어졌습니다.
SQL> INSERT INTO Dept VALUES (3, '영업부', 10);
1 개의 행이 만들어졌습니다.
SQL> INSERT INTO Dept VALUES (6, '기획부', 3);
1 개의 행이 만들어졌습니다.
SQL>
SQL> -- dept_after_update 트리거 생성
SQL> CREATE OR REPLACE TRIGGER dept_before_update after
2 UPDATE ON dept
3 FOR EACH ROW
4 BEGIN
5
6 DBMS_OUTPUT.ENABLE;
7
8 DBMS_OUTPUT.PUT_LINE('변경전 컬럼 값: ' || :old.dept_name );
9 DBMS_OUTPUT.PUT_LINE('새로운 컬럼 값: ' || :new.dept_name );
10
11 END;
12 /
트리거가 생성되었습니다.
SQL> -- 서버 출력 활성화
SQL> SET ServerOutput ON
SQL>
SQL> -- 데이터 수정 -> 트리거 실행(Trigger Firing)
SQL> UPDATE dept
2 SET dept_name = '계획관리'
3 WHERE dept_no = 6;
변경전 컬럼 값: 기획부
새로운 컬럼 값: 계획관리
1 행이 갱신되었습니다.
SQL>
SQL> -- 서버 출력 비활성화
SQL> SET ServerOutput OFF
SQL>
또다른 질문사항)
update after trigger 실행중에 예외(Exception)가 발생하면 update 쿼리도 수행되지 않습니다. 제 생각엔 after 니까 예외는 예외이고, 우선은 update쿼리의 수행결과는 반영이 되야 하는거 아닌가요?
가르쳐 주시면 감사하겠습니다.
|