728x90
오라클 호환모드가 설정되어 있는 데이터베이스에서 트리거 생성시 오류가 발생하는 케이스에 대해 소개합니다.
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
728x90
'Db2 > Db2 troubleshooting' 카테고리의 다른 글
VALID 상태가 아닌 루틴 재컴파일하기 (0) | 2019.07.22 |
---|---|
DB2 9.1 접속 오류 ( SQL30082N , rc=15 ) (0) | 2015.07.14 |
SQL0727N 오류 관련 ( SQLCODE -204 , SQLSTATE 42703 ) (0) | 2015.06.03 |
SQL0805N Package SYSLH203 was not found (0) | 2015.05.07 |
DB2 does not support PL/SQL array constructor syntax. (0) | 2014.11.03 |