티스토리 뷰

반응형

오라클 호환모드가 설정되어 있는 데이터베이스에서 트리거 생성시 오류가 발생하는 케이스에 대해 소개합니다.

DB2 인스턴스 계정에서 db2set 명령으로 오라클 호환모드 설정내역을 확인합니다.


$ db2set -all

[i] DB2_COMPATIBILITY_VECTOR=ORA

[i] DB2_SKIPINSERTED=on

[i] DB2_OPTPROFILE=yes

[i] DB2_EVALUNCOMMITTED=yes

[i] DB2_SKIPDELETED=on

[i] DB2DBDFT=hansdb

[i] DB2COMM=TCPIP

[i] DB2AUTOSTART=NO



$ db2 "create table test (aa int, id char(20))"
DB20000I  The SQL command completed successfully.
$ db2 "create table test_his (aa int, id char(20))"
DB20000I  The SQL command completed successfully.

아래는 트리거 내용입니다.

$ cat create_trigger.sql
   CREATE OR REPLACE TRIGGER TRI1 NO CASCADE AFTER INSERT ON TEST
      REFERENCING NEW AS N
      FOR EACH ROW
      BEGIN
             INSERT INTO TEST_HIS (aa,id) VALUES (N.aa, N.id);
      END
!

트리거를 생성하려고 하면 아래와 같이 SQL0206N 오류가 발생합니다.

$ db2 -td! -f create_trigger.sql
DB21034E  The command was processed as an SQL statement because it was not a
valid Command Line Processor command.  During SQL processing it returned:
SQL0206N  "N.AA" is not valid in the context where it is used.  LINE NUMBER=5.
SQLSTATE=42703

오류 원인은 오라클 호환모드로 인한 것으로, 오라클 호환모드에서 위와 같이 TRIGGER 생성 구문을 사용하면 우선적으로 오라클 스타일로 해석되는 것 같습니다.
따라서 DB2 스타일로 인식되도록 FOR EACH ROW를 FOR EACH ROW MODE DB2SQL 로 바꿔줍니다.

CREATE TRIGGER TRI1 AFTER INSERT ON TEST
      REFERENCING NEW AS N
      FOR EACH ROW MODE DB2SQL
      BEGIN
             INSERT INTO TEST_HIS VALUES (N.aa, N.id);--
      END
!


http://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0000931.html


반응형
댓글