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에서 조회됩니다.
솔루션
솔루션을 구현하려면 다음 단계를 실행하십시오.
- DB1에서 DB3를 가리키는 데이터베이스 연결 dblink2 작성
SQL > 데이터베이스 링크 dblink2를 생성하여 'EMT102U6'을 사용하여 u3로 식별된 u3에 연결합니다;
- 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
'source' 카테고리의 다른 글
Python에서 집합을 초기화하기 위해 물결 괄호 사용 (0) | 2023.07.21 |
---|---|
SQL DateTime에 대한 링크 값은 로컬(Kind=Unspecified)입니다. UTC로 만들려면 어떻게 해야 합니까? (0) | 2023.07.21 |
하루의 시간을 어떻게 비교합니까? (0) | 2023.07.21 |
Oracle SQL - 표에 없는 값 찾기 (0) | 2023.07.21 |
SpringBoot 1.3.0은 최대 절전 모드 5를 지원합니까? (0) | 2023.07.21 |