假設所有的PL/SQL包分析器收集信息,我們有2個用戶(方案)的Oracle數據庫:TARGET_USER
和TESTER_USER
。由另一個用戶
TARGET_USER
擁有一些包:
create or replace package TARGET_USER.SomePackage
is
procedure some_interface_proc(p1 number, p2 varchar2, p3 xmltype);
end;
身體這個包包含了很多功能,從some_interface_proc
調用,如:
create or replace package body TARGET_USER.SomePackage
is
procedure do_some_operation_1
is
begin
null; -- Really do some actions here
end;
procedure do_some_operation_2
is
begin
null; -- Really do some actions here
end;
procedure some_interface_proc(p1 number, p2 varchar2, p3 xmltype)
is
begin
do_some_operation_1;
do_some_operation_2;
end;
end;
權限去執行這個包授予TESTER_USER
:
grant execute on TARGET_USER.SomePackage to TESTER_USER
而且TESTER_USER
授予運行DBMS_PROFILER
軟件包所需的所有權限並擁有所有必需的表。 有了這樣的設置TESTER_USER
能夠成功運行分析器對測試腳本可以簡化爲:
begin
for cData in (
select a, b, с from table_with_test_data
) loop
TARGET_USER.SomePackage.some_interface_proc(a,b,c);
end loop;
end;
所以,收集所有的統計和一切似乎都很正常,但...
問題
爲什麼TESTER_USER
無法看到有關SomePackage.do_some_operation_1
和SomePackage.do_some_operation_2
程序的運行時間的詳細統計信息?
如DBMS_PROFILER documentation指定有4個東西可影響輪廓儀:
- 探查只收集數據用於用戶具有CREATE特權
- 一般來說單元,如果用戶可以調試一個單元,同一個用戶可以分析它。
- 以編譯單位調試信息。
- 程序單元必須被編譯爲解釋(非本地)代碼。
在試圖滿足所有要求的下一步行動做:
grant create any procedure to TESTER_USER;
grant alter any procedure to TESTER_USER;
grant debug on TARGET_USER.SomePackage to TESTER_USER;
,並檢查SomePackage的編譯模式,如果調試信息存在。
,但在完成這一切的行動TESTER_USER
仍然是內部程序不能訪問探查統計後。
所以,問題是:如果甚至有可能糾正這種情況,必須做些什麼?
在你的測試中,你是否把這些東西放在這兩個內部程序中?我在問,因爲PL/SQL可以在一定程度上優化代碼,因此也許這兩個程序根本不會執行。 –
軟件包的所有者(TARGET_USER)是否可以查看詳細統計信息? –
@VincentMalgrat裏面有很多程序,沒有列在'PLSQL_PROFILER_UNIT'表中。 – ThinkJet