当Oracle编译存储过程时,它以DIANA格式存储该过程的AST。
发布于 2016-02-03 14:56:05
有一个无文件的软件包DUMPDIANA,它意味着以人类可读的格式转储戴安娜。
文件$ORACLE_HOME\rdbms\admin\dumpdian.sql说:“文档可以在/vobs/plsql/note/dumpdiana.txt a.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),几个音符。正如我们所知,这不是一个很好的实践,我不知道为什么您不应该将DUMPDIANA上的特权授予一个普通用户。您转储的所有过程都进入同一个文件-如果删除该文件,它将停止工作,您将需要启动一个新的会话。如果它停止工作,启动一个新的会话有时似乎解决了问题。
发布于 2016-02-10 08:02:50
这是一篇关于DIANA和IDL在PDF 如何解包PL/SQL中的优秀教程,作者principal是西门子在撰写这篇文章时的主要顾问,他专门研究和保护Oracle数据库。
在其他非常有趣的事情中,你会学到:
你可以找到他的网站在这里。那里有那么多的内容。您会发现关于Oracle安全性的精彩文章和许多有用的安全工具不仅是由他开发的,而且也是由其他作者开发的。
最重要的是,如果阅读后你还有问题,你可以和他联系。
https://stackoverflow.com/questions/31752034
复制相似问题