source

오라클에서 DBlink의 동의어를 사용하는 방법은 무엇입니까?

manycodes 2023. 8. 29. 20:44
반응형

오라클에서 DBlink의 동의어를 사용하는 방법은 무엇입니까?

저는 dblink의 동의어를 만들었습니다.

create synonym dblink2 for dblink1

그러나 dblink 대신 동의어를 사용하여 쿼리할 때 원격 데이터베이스에 대한 연결 설명을 찾을없음 오류가 발생합니다.

SELECT * FROM DUAL@DBLINK2

동의어를 사용하여 쿼리하려면 어떻게 해야 합니까?

편집: dblink를 사용하여 테이블의 뷰를 만들면 작동한다는 것을 알고 있습니다.그러나 나의 요구사항은 위의 질문입니다.

안타깝게도 dblink에 대한 동의어 생성은 지원되지 않습니다.동의어 설명서를 읽어보면 동의어에 허용되는 개체는 다음과 같습니다.

CREATE SYNICOM 문을 사용하여 테이블, 뷰, 시퀀스, 프로시저, 저장된 함수, 패키지, 구체화된 뷰, Java 클래스 스키마 개체, 사용자 정의 개체 유형 또는 다른 동의어의 대체 이름인 동의어를 만듭니다.

두 번째 쿼리가 실패하는 이유는 사용자가 만든 동의어가 제대로 작동하지 않기 때문입니다.생성 시 제대로 검증되지 않으며 이러한 잘못된 동의어를 생성할 수 있습니다.확인하려면 다음 문장을 테스트하십시오.

create synonym dblink3 for no_object_with_this_name;

다음과 같은 응답이 계속 표시됩니다.

*Synonym DBLINK3 created.*

하지만 물론 이 동의어를 통해 작동하는 것은 아무것도 없을 것입니다.

저는 dblink 자체와 동의어를 만드는 것이 의미가 없다고 생각합니다.dblink를 사용하여 원격 테이블의 동의어를 만드는 것이 이상적입니다.

CREATE DATABASE LINK my_db_link CONNECT TO user IDENTIFIED BY passwd USING 'alias';
CREATE SYNONYM my_table FOR remote_table@my_db_link;

이제 동의어를 사용하여 원격 테이블을 쿼리할 수 있습니다.

SELECT * FROM my_table;

저는 db_link에 동의어를 붙이면 해결되는 비즈니스 문제를 생각하려고 하는데, 제가 생각할 수 있는 유일한 방법은 테이블 이름이 일정하지만 다른 사용자가 서로 다른 db_link를 검색할 수 있는 상수 코드를 배포해야 한다는 것입니다.또는 운영 중인 db_link를 단순 동의어 repoint로 전환할 수 있습니다.

문제는 다음과 같습니다. 그렇게 할 수 없습니다. db_link 동의어는 허용되지 않습니다.

유일한 해결책은 코드가 동의어로 테이블을 참조하고 올바른 db_link를 가리키도록 개인 동의어를 설정하는 것입니다.이렇게 하면 코드가 "Select from REMOTE_TABLE1"로 계속 이동하고 해당 원격 테이블을 가져올 DB_LINK를 뒤집을 수 있습니다.

100개 이상의 개인 동의어를 설정/재설정해야 하는 것이 고통스럽습니까?네. 하지만 자주 해야 하는 일이라면 db_link 이름을 전달하는 절차를 번들로 제공하여 동의어를 재설정합니다.

저는 이 질문이 3년 이상 된 것으로 알고 있지만, 누군가는 앞으로 다른 답변을 통해 혜택을 받을 수 있을 것입니다.

운영용 데이터베이스 2개와 개발/테스트용 데이터베이스 2개로 총 4개의 데이터베이스가 있다고 가정해 보겠습니다.

Prod DB: PRDAPP1DB1 및 PRDAPP2DB1 개발 DB: DEVAPP1DB1 및 DEVAPP2DB1

"APP2" 데이터베이스는 APP1 데이터베이스에서 데이터를 추출하고 가져오는 절차를 실행 중입니다.이러한 절차에는 다음과 같은 다양한 선택 문이 있습니다.

declare
iCount INTEGER;
begin
  insert into tbl_impdata1
  select sysdate, col1, col2, substr(col3,1,10), substr(col3,15,3)
  from tbl1@dblink2; -- Where dblink2 points to DEVAPP1DB1
  ...
  <more statements here>
  ...
EXCEPTION
  <exception handling code here>
end;

이제 개발에는 문제가 없지만 업데이트된 절차를 프로덕션에 배포할 때 dblink2를 dblink1로 계속 변경해야 합니다.

지적된 바와 같이 동의어는 이러한 목적으로 사용될 수 없습니다.대신 이름이 같고 연결 문자열이 다른 DB 링크를 만듭니다.

예: 생산 시:

CREATE DATABASE LINK "MyDBLINK" USING 'PRDAPP1DB1';

개발 시:

CREATE DATABASE LINK "MyDBLINK" USING 'DEVAPP1DB1';

그런 다음 절차에서 모든 "@dblink1" 및 "@dblink2"를 "@mydblink"로 변경하면 모든 것이 투명해집니다.

여러 스키마(사용자)가 DB 링크에 액세스할 수 있도록 하려면 공용 DB 링크를 작성해야 합니다.

예:

CREATE PUBLIC DATABASE LINK dblink1 CONNECT TO user IDENTIFIED BY password USING 'tnsalias';

이후 모든 스키마가 다음을 실행할 수 있습니다.

SELECT * FROM TABLE@dblink1

언급URL : https://stackoverflow.com/questions/34017232/how-to-use-synonym-of-a-dblink-in-oracle

반응형