2010-09-21 50 views
1

上的操作我正在編寫一個PL/SQL解析器來識別在運行過程,函數或包時在表上執行的操作(選擇,插入,刪除)。PL/SQL解析器識別表

目標:這個工具的目標是通過運行程序來識別哪些表格會受到影響,有趣的是用更好的測試用例來準備。

任何更好的想法或工具將真的幫助很多。

INPUT: 議事一些SQL文件

 or proc file. 

所需輸出:

選擇從:First_table,secondTable

- >在程序XYZ - 這是如果該過程是再調用一個程序

INSERT into:SomeTable

INSERT into:SomeDiffTable

- >程序結束XYZ - 結束一個程序。

DELETE來自:xyzTable

INSERT到:OnemoreTable

我的要求是當我解析porc1如果它調用另一個PROC2。我必須進入那個proc2來找出所有的操作,並回到proc1並繼續:

爲此我必須存儲所有程序一些地方和解析時,我必須檢查每個令牌(包含空格的單詞)在tempStorage中查找它是否是過程。

由於我的邏輯需要很多時間。任何機構都可以提出更好的邏輯來實現我的目標。

回答

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; 
/

運行您的測試,並通過挖掘審計線索查看執行結果觸摸了哪些對象。這不是防彈的,因爲它只審覈被執行過程觸及的物體,但它確實告訴你它們是如何被觸摸的。