我正在编写一个PL / SQL解析器来识别在运行过程,函数或包时对表执行的操作(选择,插入,删除)。
目标:我这个工具的目标是通过运行程序识别所有表将受到影响,乐趣准备更好的测试用例。
任何更好的想法或工具都会有很大帮助。
INPUT: 一些带有过程的SQL文件
or proc file.
需要的输出是:
SELECT from:First_table,secondTable
- >在过程XYZ中 - 这是程序再调用一个过程
插入:SomeTable
INSERT into:SomeDiffTable
- >程序结束XYZ - 一个程序结束。
DELETE from:xyzTable
插入:OnemoreTable
我的要求是当我解析porc1时,如果它调用另一个proc2。我必须进入proc2,找出所有操作的执行情况,然后返回proc1并继续:
为此我必须将所有过程存储在一些地方和解析时我必须检查tempStorage中的每个标记(带空格的单词),以确定它是否是过程。
因为我的逻辑需要很多时间。任何机构都可以提出更好的逻辑来实现我的目标。
答案 0 :(得分:2)
还有涉及触发器的可能性。这增加了额外的复杂性。
我会说你最好用递归查询挖掘DBA_DEPENDENCIES以确定抽象中的影响分析;它不会捕获动态SQL,但100%的时间都没有。在你的情况下,proc1依赖于proc2,而proc2依赖于它依赖的东西,依此类推。它不会告诉你依赖的本质 - INSERT,UPDATE,DELETE,SELECT - 但它是一个开始。
如果您真的对确定程序的单变量值运行的实际影响感兴趣,请在非生产系统中实施,然后将系统上的审核最多转为11:
begin
for i in (select owner, object_type, object_name from dba_objects
where owner in ([list of application schemas]
and object_type in ('TABLE', 'PACKAGE', 'PROCEDURE', 'FUNCTION', 'VIEW')
loop
execute immediate 'AUDIT ALL ON ' || i.owner || '.' || i.object_type ||
' BY SESSION';
end loop;
end;
/
运行您的测试,通过挖掘审计跟踪,查看通过exectution被触摸的对象。它不是防弹的,因为它只审计被执行所触及的对象,但它确实告诉你它们是如何被触摸的。