database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 13636 게시물 읽기
No. 13636
트리거에 대한 질문입니다. after와 before의 차이점
작성자
이규상(ygoodliv)
작성일
2003-02-25 11:49
조회수
2,063

트리거에서 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쿼리의 수행결과는 반영이 되야 하는거 아닌가요?

 

 

 

가르쳐 주시면 감사하겠습니다.

이 글에 대한 댓글이 총 1건 있습니다.

이보다(매뉴얼) 더 정확할 순 없겠군요 예제까지...

http://technet.oracle.com/docs/products/oracle9i/doc_library/release2/server.920/a96540/statements_76a.htm#2063897

http://technet.oracle.com/docs/products/oracle9i/doc_library/release2/appdev.920/a96590/adg13trg.htm#376

kk님이 2003-02-26 15:16에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
13639export/import [1]
초보
2003-02-25
1343
13638[질문] Proc컴파일중 멈춰 버립니다.
이윤구
2003-02-25
780
13637힌트에 대하여 [2]
장긍돌
2003-02-25
822
13636트리거에 대한 질문입니다. after와 before의 차이점 [1]
이규상
2003-02-25
2063
13634where 문에서 조건 검색 순서는??? [3]
Jinho Jeong
2003-02-25
1052
13633캐릭터 셋이 us 도 되어있어서 ㄱ,ㄴ,ㄷ 검색이 안되네요 [1]
이욱현
2003-02-25
1030
13632함수에 관한 질문 2개 [1]
초보
2003-02-25
4118
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.021초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다