문제

~ 안에 IBM 시스템 i용 DB2 녹음을 위해 이 트리거를 만듭니다. MYLOGTABLE 모든 삽입 작업은 MYCHECKEDTABLE:

SET SCHEMA MYSCHEMA;

CREATE TRIGGER MYTRIGGER AFTER INSERT ON MYCHECKEDTABLE
REFERENCING NEW AS ROWREF
FOR EACH ROW BEGIN ATOMIC
     INSERT INTO MYLOGTABLE -- after creation becomes MYSCHEMA.MYLOGTABLE
         (MMACOD, OPTYPE, OPDATE)
     VALUES (ROWREF.ID, 'I', CURRENT TIMESTAMP);
END;

DBMS는 트리거 본문을 다음과 같이 저장합니다. MYSCHEMA.MYLOGTABLE 하드코딩.

이제 전체 스키마를 새 스키마로 복사한다고 상상해보십시오. NEWSCHEMA.레코드를 삽입할 때 NEWSCHEMA.MYCHECKEDTABLE 로그 기록이 추가됩니다 MYSCHEMA.MYLOGTABLE 대신에 NEWSCHEMA.MYLOGTABLE, 즉.트리거와 해당 테이블이 있는 스키마에서.이것이 큰 문제의 원인이 됩니다!!그리고 많은 사용자들이 내 통제 없이 스키마를 복사할 수 있기 때문에...

그래서, 트리거 본문에서 트리거가 존재하는 스키마를 지정하는 방법이 있습니까? 이런 식으로 우리는 올바른 로그 레코드를 작성합니다. MYLOGTABLE.같은 것 PARENT SCHEMA...아니면 거기에 해결 방법?정말 감사합니다!

도움이 되었습니까?

해결책 2

불행히도 트리거가 존재하는 스키마가 감지할 수 없습니다 트리거 본체 내부에서.

그러나 몇 가지 해결 방법이 있습니다(덕분에 @krmilligan 도):

  • 사용자의 실행권한을 빼앗아갑니다. CPYLIB 유틸리티를 사용하도록 하세요.
  • 동기화되지 않은 트리거를 찾기 위해 주기적으로 실행되는 백그라운드 에이전트를 시스템에 만듭니다.
  • 명령을 위해 CPYLIB 기본값을 설정하다 TRG 옵션 *NO.이런 방식으로 사용자가 명시적으로 지정하는 경우를 제외하고는 트리거가 복사되지 않습니다.

트리거 복사가 필요한 컨텍스트가 있을 수 있더라도 가장 간단한 것이기 때문에 마지막 것을 선택합니다.그러한 경우에는 첫 번째 해결 방법을 사용합니다.

다른 팁

HLL에 정의 된 외부 트리거는 트리거를 실행 한 테이블의 라이브러리 이름을 포함하는 트리거 버퍼에 액세스 할 수 있습니다.이것은 MYLOGTABLE에 대한 참조를 한정하는 데 사용될 수 있습니다.

IBM Redbook 저장 프로 시저, 트리거 및자세한 정보는 iSeries 용 DB2 Universal Database의 사용자 정의 함수 를 참조하십시오.

또는 CURRENT SCHEMA <를 사용할 수 있습니다./ a> 특수 레지스터 또는 GET DESCRIPTOR 문트리거 및 / 또는 테이블이 현재 어디에 있는지 확인합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top