sourcecode

dbms_sql.open_cursor에서 ORA-29471을 해결하는 방법은?

copyscript 2023. 10. 26. 21:21
반응형

dbms_sql.open_cursor에서 ORA-29471을 해결하는 방법은?

저는 오라클 11.2.0.1.0을 사용하고 있고 dbms_sql 패키지를 작동시키려고 합니다.그러나 아래와 같이 ORA-29471 오류가 계속 발생합니다.

DECLARE
  c INTEGER;
BEGIN
  c := dbms_sql.open_cursor();
END;

ORA-29471: DBMS_SQL access denied
ORA-06512: at "SYS.DBMS_SQL", line 1017
ORA-06512: at line 4

오라클 문서에서는 이에 대해 다음과 같이 말합니다.

바인딩 및 실행 시 체크가 이루어집니다.선택적으로 DBMS_SQL 서브프로그램 호출마다 검사를 수행할 수 있습니다.체크는 다음과 같습니다.

  • current_user는 가장 최근 구문 분석을 호출할 때와 하위 프로그램을 호출할 때 동일합니다.
  • 하위 프로그램을 호출할 때 사용할 수 있는 역할은 가장 최근 구문 분석을 호출할 때 사용할 수 있는 역할의 상위 집합이어야 합니다.

정의자 권한 하위 프로그램의 사용과 일관되게 역할이 적용되지 않습니다.두 가지 검사 중 하나라도 실패하면 ORA-29470 오류가 발생합니다.

제가 알기로는 두 조건 모두 제 코드에는 적용되지 않습니다. 왜냐하면 코드가 스키마를 넘지 않기 때문입니다.

Oracle 지원(로그인 필요) 웹 사이트에서 security_level 매개 변수를 dbms_sql.open_cursor에 명시적으로 추가할 것을 제안합니다.값(0/1/2)을 추가해도 문제가 해결되지 않습니다.

나에게 혼란스러운 것은 내가 실수를 한다는 것입니다.dbms_sql.open_cursor, 여기서 보안 수준이 처음 정의됩니다.

또한 지원 웹 사이트에서는 다음과 같은 설정과 관련된 해결 방법을 제안합니다.

alter system set "_dbms_sql_security_level" = 384 scope=spfile;

아직 안 해봤어요.보안 계층을 비활성화해야 하고 지원되지 않는 오라클 기능이기 때문에 마지막 수단으로 생각하고 싶습니다.생산에 사용하기에 이상적인 상황은 거의 없습니다.또한, 문제를 전혀 해결하지 못하고 감추기만 합니다.

이 오류를 해결하려면 어떻게 해야 합니까?

코드가 다음 코드를 생성하는 유일한 이유(지금은 다른 코드를 볼 수 없음)ORA-29471당신은 이미 만들어졌습니까?dbms_sql잘못된 커서 ID를 제공하여 세션에서 작동할 수 없습니다.

/* dbsm_sql detects invalid cursor ID in this session  */ 
SQL> declare
  2    c_1 number := 5;  -- invalid cursor ID. There is no cursor 
  3    l_res boolean;    -- opened with ID = 5     
  4  begin
  5    l_res := dbms_sql.is_open(c_1);
  6  end;
  7  /
declare
*
ERROR at line 1:
ORA-29471: DBMS_SQL access denied 
ORA-06512: at "SYS.DBMS_SQL", line 1104 
ORA-06512: at line 5 


/* An attempt to execute this simple anonymous PL/SQL block after 
   an invalid cursor ID has already been detected by the dbms_sql 
   in the current session will lead to ORA-29471 error  
*/

SQL> declare
  2    c_2 number;
  3  begin
  4    c_2 := dbms_sql.open_cursor();
  5  end;
  6  /
declare
*
ERROR at line 1:
ORA-29471: DBMS_SQL access denied 
ORA-06512: at "SYS.DBMS_SQL", line 1084 
ORA-06512: at line 4 

새로 설정된 세션에서 해당 코드를 실행해 보십시오.

한가지 해결책이 될 수 있습니다.v$Session보다.

커서가 목록에 존재할 경우, 커서를 계속 사용할 수 있음을 의미합니다.그 다음에 그것에서 식별합니다.sql_id, 확인할 수 있습니다.여기서 목록을 생성합니다.

  select  sql_id, sql_text, count(*) as "OPEN CURSORS", user_name 
   from v$open_cursor
  where user_name <>'SYS' 
group by sql_text, user_name 
order by count(*) desc;

여기 더.

언급URL : https://stackoverflow.com/questions/20690303/how-to-solve-ora-29471-on-dbms-sql-open-cursor

반응형