트리거(ORA-39083, ORA-00942)와 관련된 Oracle IMPDP REMAP_SCHMA 문제에 대한 좋은 해결 방법이 있습니까?
오라클 데이터 펌프 가져오기 도구(IMPDP)를 사용할 수 있습니다.EXE) REMAP_SCHEMA 옵션을 사용하여 한 스키마를 다른 스키마로 가져옵니다.그러나 트리거가 제대로 재매핑되지 않는 문제가 있습니다.그러면 다음과 같은 오류와 함께 트리거가 전혀 생성되지 않습니다.
ORA-39083: Object type TRIGGER failed to create with error: ORA-00942: table or view does not exist Failing sql is: CREATE TRIGGER "**NEW_SCHEMA**"."METER_ALARMS_BI" BEFORE INSERT ON
**OLD_SCHEMA**.METER_ALARMS ...
그 이유는 생성 SQL이 여전히 OLD_SCHEMA를 참조하기 때문입니다. 오라클 문서에는 다음과 같이 나와 있습니다.
Import에서 찾을 수 없는 특정 스키마 참조가 있기 때문에 매핑이 100% 완료되지 않을 수 있습니다.예를 들어 Import(가져오기)는 형식, 보기, 프로시저 및 패키지 정의 본문에 포함된 스키마 참조를 찾지 못합니다.
IMHO 이것은 오라클에 의한 약간의 경찰이지만 그것은 또 다른 논의입니다!
Oracle Metalink 노트 750783.1에 따르면 해결 방법은 다음과 같습니다.
- 관련 DDL 명령을 포함하도록 SQLFILE을 만듭니다.
impdp system/****** directory=test_dp
DUMPFILE=export_schemas.dmp
remap_schema=u1:u2 sqlfile=script.sql
- 작성된 SQLFILE에서 영향을 받는 DDL을 추출하고 스키마 참조를 수정합니다.그런 다음 명령을 수동으로 실행합니다.
특히 장애가 발생한 개체가 많고 데이터베이스의 현장 업그레이드를 위해 여러 스키마를 결합하는 프로세스를 자동화하려는 경우에는 이 방법이 좋지 않습니다.
이것을 할 더 좋은 방법을 찾은 사람이 있습니까?현장에서 사용하려면 100% 신뢰할 수 있는 솔루션이 필요합니다.생성된 SQL 파일을 파싱할 수는 있는데 100% 맞힐 수 있나요?IMPDP가 실행하는 CREATE SQL 문을 가로채서 가져올 때 바로 수정할 수 있는 방법이 없을까요?DMP 파일을 직접 패치 해주실 수 있나요?
스키마 이름이 스키마 이름이 아닌 다른 부분으로 코드에 나타날 수 있는지 여부에 따라 달라질 것 같습니다.예를 들어 스키마 이름과 동일한 문자를 포함하는 변수 이름이 있습니까?그렇지 않다면 생성된 트리거 생성 스크립트를 편집하는 프로세스를 스크립팅하는 것이 그리 어렵지 않을 것으로 생각됩니다.데이터 펌프를 사용하여 텍스트 코드가 없는 개체 유형(트리거, 패키지, 프로시저, 함수 등이 아님)을 내보내고 가져온 다음 코드 개체에 대한 SQL을 덤프하고 이전 스키마를 새 스키마로 바꿀 수 있습니다.
교체하지 않으려는 위치에 이전 스키마 이름이 나타나면 작업이 더 어려워집니다.코드 개체를 추출하여 생성하고 모든 오류를 수집할 수 있습니다.그런 다음 장애가 발생한 개체의 이름을 가져와 오류에 따라 이전 schema.objectname을 newschema.objectname으로 바꾸고 다시 실행해 보십시오.
이전 스키마와 같은 문자열이 없는 경우 트리거 텍스트에서 스키마를 편집하는 방법의 예.교체하지 않으려는 항목:
SQL>
SQL> set define off
SQL>
SQL> drop table test1.tab1;
Table dropped.
SQL> drop table test1.tab2;
Table dropped.
SQL>
SQL> create table test1.tab1
2 (
3 col1 number,
4 col2 number
5 );
Table created.
SQL>
SQL> create table test1.tab2
2 (
3 col1 number,
4 col2 number
5 );
Table created.
SQL>
SQL> create or replace trigger test1.trg1
2 before insert or update on test1.tab1
3 for each row
4 begin
5 :new.col2 := :new.col1*2;
6 end;
7 /
Trigger created.
SQL>
SQL> create or replace trigger test1.trg2
2 before insert or update on test1.tab2
3 for each row
4 begin
5 :new.col2 := :new.col1*2;
6 end;
7 /
Trigger created.
SQL>
SQL> drop table clobout;
Table dropped.
SQL>
SQL> create table clobout (doc clob);
Table created.
SQL>
SQL> declare
2 h NUMBER; --handle returned by OPEN
3 th NUMBER; -- handle returned by ADD_TRANSFORM
4 doc CLOB;
5 BEGIN
6
7 -- Specify the object type.
8 h := DBMS_METADATA.OPEN('TRIGGER');
9
10 -- Use filters to specify the particular object desired.
11 DBMS_METADATA.SET_FILTER(h,'SCHEMA','TEST1');
12
13 -- Request that the schema name be modified.
14 th := DBMS_METADATA.ADD_TRANSFORM(h,'MODIFY');
15 DBMS_METADATA.SET_REMAP_PARAM(th,'REMAP_SCHEMA','TEST1','TEST2');
16
17 -- Request that the metadata be transformed into creation DDL.
18 th := DBMS_METADATA.ADD_TRANSFORM(h,'DDL');
19
20 dbms_metadata.set_transform_param(th,'SQLTERMINATOR',true);
21
22 -- Fetch the triggers.
23
24 LOOP
25 doc := DBMS_METADATA.FETCH_CLOB(h);
26 EXIT WHEN (doc is null);
27 insert into clobout values (doc);
28 commit;
29 END LOOP;
30
31 -- Release resources.
32 DBMS_METADATA.CLOSE(h);
33 END;
34 /
PL/SQL procedure successfully completed.
SQL>
SQL> -- update schema name in triggers
SQL>
SQL> update clobout set doc=replace(doc,'test1.','test2.');
2 rows updated.
SQL>
SQL> commit;
Commit complete.
SQL>
SQL> select doc from clobout;
CREATE OR REPLACE EDITIONABLE TRIGGER "TEST2"."TRG1"
before insert or update on test2.tab1
for each row
begin
:new.col2 := :new.col1*2;
end;
/
ALTER TRIGGER "TEST2"."TRG1" ENABLE;
CREATE OR REPLACE EDITIONABLE TRIGGER "TEST2"."TRG2"
before insert or update on test2.tab2
for each row
begin
:new.col2 := :new.col1*2;
end;
/
ALTER TRIGGER "TEST2"."TRG2" ENABLE;
SQL>
SQL> spool off
DBMS_METATA를 찾아보실 수 있습니다.
REMAP_SCHEMA 옵션이 있습니다.이것이 DATAPUMP보다 더 잘 작동할지 확실하지 않습니다. 그리고 DATAPUMP가 DBMS_METadata를 사용할 것이라고 생각합니다.하지만 결과물을 '후처리'하는 것이 더 쉬울 것입니다.
언급URL : https://stackoverflow.com/questions/2138348/is-there-a-good-workaround-to-the-oracle-impdp-remap-schema-issue-with-triggers
'programing' 카테고리의 다른 글
Spring Boot 컨트롤러에서 이미지를 반환하고 파일 시스템처럼 사용하는 방법 (0) | 2023.10.30 |
---|---|
목표-C에서 NSDate를 현재 UTC로 설정 (0) | 2023.10.30 |
익명 블록 안에 선택 결과 표시 (0) | 2023.10.30 |
스타일시트와 xslt proc로 xslt를 사용하여 xml에서 요소를 제거하는 방법은 무엇입니까? (0) | 2023.10.30 |
봄맞이 보안에 개미 사냥꾼이 여럿 등장합니다. (0) | 2023.10.30 |