programing

PL/SQL 저장 프로시저의 AST(추상 구문 트리)에 액세스하려면 어떻게 해야 합니까?

telebox 2023. 7. 11. 22:51
반응형

PL/SQL 저장 프로시저의 AST(추상 구문 트리)에 액세스하려면 어떻게 해야 합니까?

Oracle은 저장 프로시저를 컴파일할 때 절차의 AST를 DIAEA 형식으로 저장합니다.

  • 이 AST에 액세스하려면 어떻게 해야 합니까?
  • 이 AST를 처리하기 위한 내장 도구가 있습니까?

DUMPDIANA라는 문서화되지 않은 패키지가 있는데, 이 패키지는 사람이 읽을 수 있는 형식으로 다이애나를 덤프합니다.

$ORACLE_HOME\rdbms\admin\dumpdian 파일입니다.sql은 "Documentation은 /vobs/plsql/notes/dumpdiana.txt에서 사용할 수 있습니다."라고 말합니다.해당 파일을 찾을 수 없으며, 파일이 없으면 일부 매개 변수의 의미를 추측할 수밖에 없습니다.DUMPDIANA의 기본 용도는 다음과 같습니다.

SQL> show user
USER is "SYS"
SQL> @?\rdbms\admin\dumpdian

Library created.


Package created.


Package body created.

create or replace procedure hello_world
  2  as
  3  begin
  4  dbms_output.put_line('hello world');
  5* end;


Procedure created.

SQL> set serveroutput on
SQL> execute sys.DUMPDIANA.dump('HELLO_WORLD');
user: SYS

PL/SQL procedure successfully completed.

이 시점에서 폴더에 파일 쌍이 생성되어야 합니다.$ORACLE_BASE/diag/rdbms/orcl12c/orcl12c/trace두 파일은 다음과 같은 명명 규칙을 따르는 것으로 보입니다.

orcl12c_ora_{PROCESS}.trc
orcl12c_ora_{PROCESS.trm

여기서 trc 파일은 해당 trm 파일의 사람이 읽을 수 있는 버전이고 {PROCESS}은(는) 운영 체제 프로세스 ID입니다.이를 찾으려면 동일한 세션에서 다음 쿼리를 사용합니다.

select p.spid from v$session s,v$process p 
where s.paddr = p.addr
and s.sid = sys_context('USERENV','SID');

예를 들어 세션 ID가 8861인 경우 bash 셸에서 다음을 사용하여 결과를 볼 수 있습니다.

vim $ORACLE_BASE/diag/rdbms/orcl12c/orcl12c/trace/orcl12c_ora_8861.trc

결과는 흥미롭습니다...특별히 직관적이지 않다면!예를 들어, 생성된 파일의 일부입니다.HELLO_WORLD 문자열 리터럴을 기록합니다.

PD1(2):D_COMP_U  [
    L_SRCPOS : row 1 col 1
    A_CONTEX :
PD2(2):      D_CONTEX  [
          L_SRCPOS : row 1 col 1
          AS_LIST :  < >
      ]
    A_UNIT_B :
PD3(2):      D_S_BODY  [
          L_SRCPOS : row 1 col 1
          A_D_ :
PD4(2):            DI_PROC  [
                L_SRCPOS : row 1 col 11
                L_SYMREP : HELLO_WORLD,
                S_SPEC : PD5^(2),
                S_BODY : PD8^(2),

메모 몇 개.저는 SYS로 실행했습니다. 저희가 잘 아는 바와 같이 이것이 일반 사용자에게 DUMPDIANA에 대한 권한을 부여하지 말아야 하는 이유가 아닙니다.덤프하는 모든 절차가 동일한 파일로 이동합니다. 해당 파일을 삭제하면 해당 파일이 작동을 중지하고 새 세션을 시작해야 합니다.작동이 중지되면 새 세션을 시작하면 문제가 해결되는 것처럼 보일 수 있습니다.

다음은 DIAA 및 IDL에 대한 PDF 문서 작성 당시 Oracle 데이터베이스 연구 및 보안을 전문으로 하는 Siemens의 수석 컨설턴트인 Pete Finnigan의 PL/SQL 포장 해제 방법에 대한 훌륭한 튜토리얼입니다.

다른 매우 흥미로운 것들 중에서 여러분은 다음과 같은 것을 배우게 될 것입니다.

  • 다이아나는 IDL(Interface Definition Language)로 기록됩니다.
  • IDL이 저장된 4개의 테이블(IDL_CHAR$, IDL_SB4$, IDL_UB1$ 및 IDL_UB2$)
  • 래퍼 PL/SQL은 단순히 IDL로 작성된 DIANA입니다.
  • Dumpdiana는 기본적으로 설치되지 않습니다. DIAEA, PIDL 및 DIUTIL PL/SQL 패키지도 설치되어 있고 SYS로 실행해야 합니다.
  • 다이아나 트리를 버리고 이해하는 방법.
  • DIANA에서 PL/SQL 소스를 재구성하는 방법.
  • PL/SQL 언래퍼 작성 방법
  • PL/SQL API 기반 래퍼 해제에 대한 제한 사항입니다.
  • PL/SQL API 자체의 제한 사항입니다.
  • 다이아나 노드 및 속성을 열거하는 방법.
  • 개념 증명 래퍼 해제.

당신은 여기에서 그의 웹사이트를 찾을 수 있습니다.거기에는 정말 많은 내용이 있습니다.Oracle 보안에 대한 훌륭한 문서와 그뿐만 아니라 다른 저자들이 개발한 유용한 보안 도구를 많이 찾을 수 있습니다.

무엇보다도, 독서 후에도 여전히 질문이 있다면 그에게 연락할 수 있습니다.

언급URL : https://stackoverflow.com/questions/31752034/how-do-i-access-the-ast-abstract-syntax-tree-for-a-pl-sql-stored-procedure

반응형