source

ORA-00980 동의어 변환은 PLSQL에서 더 이상 유효하지 않습니다.

lovecheck 2023. 7. 21. 21:41
반응형

ORA-00980 동의어 변환은 PLSQL에서 더 이상 유효하지 않습니다.

데이터베이스 링크를 통해 SQL에서 액세스할 수 있는 원격 Oracle 데이터베이스의 동의어가 있습니다.

insert into my_table select * from my_synonym@my_database_link;

위의 문장을 PLSQL 블록에 넣으면 컴파일이 되지 않고 "ORA-00980: 동의어 번역은 더 이상 유효하지 않습니다."라는 오류 메시지가 나타납니다.표준 설명은 동의어가 가리키는 테이블 등이 삭제되었지만 SQL에서는 문이 작동하기 때문에 그렇지 않습니다.

어떤 것이 SQL에서는 작동하지만 PL/SQL에서는 작동하지 않는 경우 대부분의 경우 권한 문제입니다.

사용자가 역할을 통해 받은 권한은 PL/SQL 블록을 입력할 때 활성화되지 않습니다.그래서 아마도SELECT기본 테이블에 대한 권한이 역할을 통해 부여되었으므로 PL/SQL 블록에서 "활성"이 아닙니다.

일반적인 방법은 역할이 아닌 사용자에게 직접 권한을 부여하는 것입니다.

도와주신 모든 분들께 감사드립니다.이는 Oracle의 제한 사항으로 판명되었습니다.

https://support.oracle.com/rs?type=doc&id=453754.1

적용 대상:

PL/SQL - 버전 9.2.0.8 이상 이 문서의 정보는 모든 플랫폼에 적용됩니다.2015년 4월 1일 관련성 확인

증상

원격 데이터베이스에서 데이터를 선택할 때 PL/SQL 블록이 실패하고 다음 오류가 발생합니다. ORA-00980: 동의어 변환이 더 이상 유효하지 않습니다.다음 코드는 이 문제를 보여줍니다.

DB3에서(테이블 작성)

u3/u3 드롭 테이블 탭 연결; 테이블 탭 생성(c1 번호); 탭 값에 삽입(1); 커밋;

DB2에서 (DB3의 표와 동의어 작성)

connect u2/u2 drop database link2; create database link2 'EMT102U6'을 사용하여 u3로 식별된 u3에 연결; 선택 * global_name@dblink2; drop syn2; 탭@dblink2에 대한 동의어 syn2 생성; SYN2에서 * 선택

DB1에서 (DB2에서 동의어와 동의어 작성)

connect u1/u1 drop database link1; create database link1 'EMT102W6'을 사용하여 u2에 연결합니다; 선택 * global_name@dblink1; Drop SYONMINON syn1; SYN2@dblink1에 대한 CREATE SYN1; syn1

이 작업은 SQL에서 작동하지만 PL/SQL에서 호출하면 실패합니다.

번호 선언; c1을 syn1에서 번호로 선택하기 시작; 종료; /

행 4: ORA-06550: 행 4, 열 3: PL/SQL: ORA-00980: 동의어 변환이 더 이상 유효하지 않습니다. ORA-06550: 행 4, 열 3: PL/SQL: SQL 문이 무시되었습니다.

원인

이 문제는 9I -> 8I-> 7.3.4, GETING ORA-980의 PL/SQL 프로시저에서 쿼리 중인 Bug 2829591에 보고되었습니다.이 버그는 다음과 같은 이유로 'NOT A BUG'로 닫혔습니다.

PL/SQL은 컴파일 단계 동안 데이터베이스 링크를 따르도록 중간 데이터베이스(DB2)에 지시할 수 없습니다.따라서 이 PL/SQL 블록을 컴파일하고 실행하려면 dblink1 및 dblink2 데이터베이스 링크를 모두 프런트 엔드 데이터베이스인 DB1에 정의해야 합니다.런타임 데이터베이스 링크 dblink2는 예상대로 DB2에서 조회됩니다.

솔루션

솔루션을 구현하려면 다음 단계를 실행하십시오.

  1. DB1에서 DB3를 가리키는 데이터베이스 연결 dblink2 작성

SQL > 데이터베이스 링크 dblink2를 생성하여 'EMT102U6'을 사용하여 u3로 식별된 u3에 연결합니다;

  1. DB1에 PL/SQL 블록을 만들고 컴파일합니다.

'EMT102U6'을 사용하여 데이터베이스 링크 dblink2를 u3에 연결합니다.

* from Number; BEGIN * global_name@dblink2; ; 시작택
syn1에서 c1을 num으로 선택합니다; END; /PL/SQL 절차가 성공적으로 완료되었습니다.

팁: 다른 옵션은 PL/SQL 블록에서 동적 SQL을 해결 방법으로 사용하는 것입니다.동적 SQL을 사용할 때 데이터베이스 링크는 컴파일 시 확인되지 않고 런타임에 확인됩니다.

해결 방법은 대신 Oracle 뷰를 사용하는 것입니다.

CREATE VIEW v_my_synomym as (select * from my_synonym@my_database_link);

그런 다음 패키지 또는 절차의 보기를 참조합니다.

insert into my_table select * from v_my_synonym;

연결 문자열에서 사용하는 사용자에 대해 "my_synonymous"에 대한 원격 데이터베이스 허가 체크인은 거의 "선택"되어야 하며, 이 동의어가 가리키는 개체도 선택해야 합니다(아마 누군가 테이블을 삭제했을 수 있습니다).

테이블/뷰/프로시저의 소유자가 동의어에 언급된 소유자와 일치하지 않을 때 이 문제를 발견했습니다.

예: TABLE_BRACH의 소유자가 소유자 A이고 Sonymous에서 언급된 테이블 소유자가 다른 사람인 경우(소유자 A가 아님).

해결책: 1. 동의어를 삭제합니다. 2. 올바른 소유자와 동일한 이름으로 만듭니다.

CREATE PUBLIC SYNONYM BRANCH FOR ownerA.TABLE_BRACH ;

언급URL : https://stackoverflow.com/questions/31789485/ora-00980-synonym-translation-no-longer-valid-in-plsql

반응형