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
운영게시판
최근게시물
DB2 Q&A 1189 게시물 읽기
No. 1189
트리거에서 다른 DB의 테이블에 접근할 수 있나요?
작성자
DB2
작성일
2006-11-28 01:10
조회수
11,758

버전은 DB2 8.2 입니다.

A 라는 DB의 a 테이블에 트리거를 걸어서 데이타가 들어오면
B 라는 DB의 b 테이블에 데이타를 넣어야 합니다..

A,B는 한인스턴스 아래의 DB이고요..user도 동일합니다.

근데 그냥 b만 쓰면 없는 A.b 테이블에 접근할 것이고..
앞에 뭘 붙여야 되는지를 모르겠네요..

MySQL때는 그냥 A.a B.b로 썼었는데..

프로시져에서도 같이 여러 DB안의 테이블들의 데이터를 서로 옮기고 해야하는데,
접근방법이 같은지도 궁금합니다.

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

접근할 DB의 테이블들에 대해  federation을 구성해주시면 접근이 가능합니다.
데이터를 변경하려면 SET PASSTRUE 권한이 있어야 합니다.

PASSTRUE 권한이 없을 경우
>>-GRANT PASSTHRU ON SERVER--server-name----TO------------------>
 
      .-,------------------------------------.
      V                                      |
>-------+-+-------+---authorization-name--+--+-----------------><
        | +-USER--+                       |
        | '-GROUP-'                       |
        '-PUBLIC--------------------------'
 


예제)
http://www.ibmdb2.net/board/board.php?bnum=4&num=716&act=read&cate=&page=1&search=&s_word=

http://www.ibmdb2.net/board/board.php?bnum=4&num=209&act=read&cate=&page=1&search=title&s_word=feder

 

도님이 2006-11-29 09:12에 작성한 댓글입니다. Edit

어제 federation을 찾아보고 구성을 했습니다.

근데 트리거에서 별칭으로 insert,update,delete등은 안되더군요.

일반 쿼리에서 쓰거나 프로시져에서는 됩니다.

그래서 트리거안에서 프로시져를 호출했더니 역시 안되고요..

 

별칭외에 접근하는 방법은 없는 것 같고..

구글에서도 trigger federated 로 검색해봤는데 비슷한 문제를

겪고 있는 사람들이 좀 있네요..

DB2님이 2006-11-29 10:49에 작성한 댓글입니다. Edit

프로시저 또는 함수 참조를 포함하는 트리거 조치

 프로시저 및 함수(사용자 정의 함수(UDF) 포함)는 트리거의 트리거 조치 내에서 호출될 수 있습니다. 프로시저는  CALL문을 사용하여 호출될 수 있습니다. 함수는 트리거 SQL문 내에 호출될 수 있습니다. 트리거에서 루틴을 호출하면 트리거에 복잡한 논리가 포함될 수 있습니다. TOTAL_SALES라는 SQL 프로시저 호출을 포함하는 트리거의 정의를 보여주는 다음 예를 고려해 보십시오.

    CREATE TRIGGER trig1 AFTER UPDATE ON t1
   REFERENCING NEW AS n
       FOR EACH ROW MODE DB2SQL
   WHEN (n.c1 > 100);
       BEGIN ATOMIC
      DECLARE rs INTEGER DEFAULT 0;
      CALL TOTAL_SALES(n.c1, n.c2);
      GET DIANOSTICS rs = RETURN_STATUS;
      VALUES(CASE WHEN rc < 0 
                  THEN RAISE_ERROR('70001', 
                         'PROC CALL failed'));
      END; 

 프로시저를 트리거의 서브루틴으로 간주할 수 있습니다. SQL 프로시저가 호출된 후,  GET DIAGNOSTICS문을 실행하여 프로시저의 리턴 상태를 점검합니다. 리턴 상태가 프로시저에 오류가 발생했음을 나타내면 오류가 발생한 것입니다.

다음은 트리거 본문 내의 함수 참조 예입니다. 함수는 VALUES절 내에 참조됩니다.

    CREATE TRIGGER REORDER 
      AFTER UPDATE OF ON_HAND, MAX_STOCKED ON PARTS 
      REFERENCING NEW AS N_ROW 
      FOR EACH ROW
      WHEN (N_ROW.ON_HAND < 0.10 * N_ROW.MAX_STOCKED) 
      BEGIN ATOMIC 
      VALUES ( ISSUE_SHIP_REQUEST
              (N_ROW.MAX_STOCKED - N_ROW.ON_HAND, N_ROW.PARTNO) ); 
    END 

 ISSUE_SHIP_REQUEST 함수는 운송 부서에 부품을 주문해야 함을 알리는  전자 우편을 보내는 외부 함수일 수 있습니다. 함수는 전이 변수가 포함된 표현식을 매개변수로 사용합니다.

 트리거 조치에 규정하지 않은 프로시저 이름을 사용한 프로시저 호출이 들어 있거나 규정하지 않은 함수 이름을  사용한 함수 참조를 포함하는 트리거 조치 SQL문이 들어 있을 때, 프로시저 또는 함수는 다음에 따라 해석됩니다. 

 

     
  • 트리거 작성시 SQL 경로 
  • 트리거 작성자가 보유하는 루틴 EXECUTE 특권

 루틴은 SQL, Java(TM), C, C++ 또는 .NET 언어로 작성될 수 있습니다. 이를 통해 논리 흐름의 복잡한 제어, 오류 처리 및 복구,  시스템과 라이브러리 함수에 대한 액세스가 가능합니다. 이 기능을 통해 트리거 조치는 트리거가 활성화될 때 비SQL 유형의 조작을 수행할 수 있습니다. 예를 들어, 트리거에서 호출된 UDF는 전자 우편 메시지를 송신하고 경보 메커니즘으로  작동할 수 있습니다. 메시지와 같은 외부 조치는 커미트 제어 하에 있지 않으며, 나머지 트리거 조치의  성패에 관계없이 실행됩니다.

또한 함수가 오류 발생을 나타내는 SQLSTATE를 리턴할 수도 있으며 이 오류로 트리거링 SQL문이 실패할 수도 있습니다. 이것은 사용자 정의 제한조건을 구현하는 한 가지 방법입니다. SIGNAL SQLSTATE문을 사용하여 구현할 수도 있습니다. 복잡한 사용자 정의 제한조건을 점검하는 수단으로 트리거를 사용하려면 트리거 SQL문에서 RAISE_ERROR 내장 함수를 사용할 수 있습니다. 이 함수는 응용프로그램으로 사용자 정의 SQLSTATE(SQLCODE -438)를 리턴하는 데 사용할 수 있습니다.

예를 들어, HIREDATE가 직원이 근무를 시작한 날짜인, EMPLOYEE 테이블의 HIREDATE 컬럼에 관련된 어떤 규칙에 대하여 고려해 보십시오.

  • HIREDATE는 삽입한 날짜이거나 미래의 날짜여야 합니다.
  • HIREDATE는 삽입한 날짜로부터 1년이 넘어서는 안됩니다.
  • HIREDATE가 삽입한 날짜로부터 6개월에서 12개월 사이라면, send_note라는 UDF를 사용하여 인사 담당자에게 알리십시오.

다음의 트리거는 INSERT에서 이러한 규칙을 모두 처리합니다.

    CREATE TRIGGER CHECK_HIREDATE
      NO CASCADE BEFORE INSERT ON EMPLOYEE
      REFERENCING NEW AS NEW_EMP
      FOR EACH ROW
      BEGIN ATOMIC
      VALUES CASE
        WHEN NEW_EMP.HIREDATE - CURRENT DATE > 600. 
         AND NEW_EMP.HIREDATE - CURRENT DATE <eq; 10000. 
         THEN SEND_NOTE('persmgr', NEW_EMP.EMPNO, 'late.txt') 
        WHEN NEW_EMP.HIREDATE < CURRENT DATE
         THEN RAISE_ERROR('85001', 'HIREDATE has passed') 
        WHEN NEW_EMP.HIREDATE - CURRENT DATE > 10000.
         THEN RAISE_ERROR('85002', 'HIREDATE too far out') 
     END;
    END 
마라도님이 2006-11-29 11:17에 작성한 댓글입니다.
이 댓글은 2006-11-29 11:18에 마지막으로 수정되었습니다. Edit

1. 트리거에서 페러데이티드 오브젝트를 조작하는 경우

일단 전 별칭관련으로 추정하는데 테스트용으로 트리거를 만든것이라

세이브포인트나 화면이동커서등은 사용되지 않습니다.

에러코드는 아래가 뜹니다.

 

SQL30090N  조작이 응용프로그램 실행 환경에 대해 유효하지 않습니다.

이유 코드 = "22".  LINE NUMBER=10.  SQLSTATE=25000

여러가지 이유가 나오는데 22번에 관해서만 적으면

22 페더레이티드 삽입, 갱신 또는 삭제 조작은 다음과 같은 경우에
함수, 데이터-변경-테이블-참조, 동적 복합문, 트리거 및
응용프로그램 실행 환경에서 유효하지 않습니다. 

o   SAVEPOINT가 적용됨

o   화면 이동 커서가 사용됨

o   목표 뷰에 다중 테이블 또는 별칭이 포함됨

이유 22의 경우, 페더레이티드 삽입, 갱신 또는 삭제 조작을
제거하거나 다음을 수행하십시오. 

o   함수, 데이터-변경-테이블-참조, 동적 복합문 또는 트리거
    외부에서 페더레이티드 삽입, 갱신 또는 삭제 조작 실행. 

o   적용된 세이브포인트 해제

o   화면 이동 커서 사용 제거

o   하나의 테이블 또는 별칭을 참조하도록 목표 뷰 재정의

o   트리거 외부에서 페더레이티드 삽입, 갱신 또는 삭제 조작 실행.

 

2. 페러데이티드 오브젝트를 수정하는 프로시져를 만들고

그 프로시져를 콜하는 트리거를 만들면 트리거 작성은 됩니다.

트리거가 동작하려할때 다음과 같은 에러메시지가 나옵니다.

(쿼리로 직접 프로시져만 콜할시에는 정상동작됩니다.

트리거를 통해서 하려할때만 에러가 납니다.)

 

일단 트리거안에 프로시져가 에러가 났다는 코드가 먼저나오고요..

정보로 프로시져에 왜 에러가 났는지에 대한 코드가 나옵니다.

 

SQLCODE "-20136", SQLSTATE "55047" 이고 메시지 레퍼런스는 다음과 같은 내용입니다.

 

루틴이 페러데이티드 오브젝트에 액세스하려고 했습니다.
현재 외부함수또는 메소드로부터 페러데이티드 오브젝트의 액세스를 지원하지 않습니다.

 

일단은 일정상 DB분리를 하지 않고 같은 DB내에 가기로 했습니다..

두분 모두 감사합니다.

DB2님이 2006-11-29 12:29에 작성한 댓글입니다.
이 댓글은 2006-11-29 12:33에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1192DB2 Microsoft Transaction Server (MTS) [1]
DB2처음이
2006-11-29
7660
1191DB2에서의 AUDIT TRAIL 기능 아시는분 [1]
조성욱
2006-11-28
8633
1190윈도우에서 DB2제거하기 [1]
jina
2006-11-28
8894
1189트리거에서 다른 DB의 테이블에 접근할 수 있나요? [4]
DB2
2006-11-28
11758
1188db2 cli 프로그램 중 ~ 도와주시기 바랍니다...... [2]
김선아
2006-11-27
8991
1187LOB,CLOB,LONG data type도 reorg가 가능합니까? [1]
디비2
2006-11-24
7894
1186DB2 트리거나 함수 바로 작성 어떻게 하나요(8.2) [2]
DB2
2006-11-24
8144
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다