środa, 29 czerwca 2011

Tracing kodu PL/SQL

Przy prostych programach, jesteśmy w stanie sami prześledzić proces wzajemnego wywoływania się różnych procedur. Jeśli jednak projektujemy spory system, lub przejmujemy po kimś innym projekt warto byłoby móc zautomatyzować ten proces.
Jeśli chcemy obserwować wywołania procedur w projekcie (np. kiedy zostały wywołane i przez jaką inną procedurę) możemy skorzystać z dobrodziejstw pakietu dbms_trace.
Sama obserwacja wymaga kilku czynności, natomiast przed przystąpieniem do pracy z tym pakietem musimy powziąć przygotowania.
Pakiet dbms_trace jest już w bazie skompilowany i gotowy do użycia. Do pracy będą nam też potrzebne odpowiednie tabelki do których ładowane będą dane z trace'owania naszej aplikacji. Tych tabelek jeszcze nie mamy. Skrypt  tworzący te tabelki oraz niezbędne widoki możemy znaleźć w $ORACLE_HOME/rdbms/admin i nazywa się tracetab.sql

tracetab.sql na pewno znajdziecie w wersji Enterprise 11g, sprawdzałem to również na Express Edition 10g ale tego pliku tam nie znalazłem. Być może trzeba by go było skądś ściągnąć. Pakiet dbms_trace był w obu wersjach. Jeśli podczas wykonywania tracetab.sql wypluje nam kilka błędów to nie ma co się przejmować, wszystko i tak działa.


Generalnie dalsza część opowieści po utworzeniu odpowiedniej struktury tabel i widoków przedstawia się tak:

  • Trzeba umożliwić tracing dla pakietów i procedur/funkcji które chcemy obserwować.
ALTER PROCEDURE NAZWA_PROCEDURY COMPILE DEBUG;
lub
ALTER PACKAGE NAZWA_PAKIETU COMPILE DEBUG BODY;
lub
wykonanie następnego punktu i ponowną kompilację kodu.
  • Włączyć tracowanie dla sesji (tylko w tym przypadku będziemy mogli obserwować bloki anonimowe):
ALTER SESSION SET PLSQL_DEBUG=TRUE;

  • Ustawić poziom trace'owania:
EXECUTE DBMS_TRACE.SET_PLSQL_TRACE(DBMS_TRACE.TRACE_ALL_CALLS);


Poziomów trace jest kilka, na pewno uncle google je zna :) Powyższe (trace_all_calls) śledzi wszystkie wywołania procedur/funkcji/pakietów).


  • Wykonanie procedury/funkcji dla której włączyliśmy tracing;
  • Wyłączenie trace'owania  ( po co mają nam się zbierać dane i baza puchnąć jak już mamy to co chcemy?)
 EXECUTE DBMS_TRACE.CLEAR_PLSQL_TRACE;

Po wszystkim możemy zajrzeć do widoków:

plsql_trace_events
plsql_trace_runs

zawierających informacje na temat obserwowanych procedur i funkcji, czasu ich wywołania oraz kilku innych ciekawych rzeczy.




Uprzedzając pytanie: Nie. Nie możemy tej metody wykorzystać do obserwacji odwołań do tabeli/widoków lub poczynań użyszkodników. Do tego służy audyt (również opisany na tym blogu)
Uprzedzając kolejne pytanie: Tak. Inni niż SYS użytkownicy również mogą korzystać z tej metody, jednak najpierw należy im nadać uprawnienia do pakietu dbms_trace oraz w.w. widoków (patrz artykuł o uprawnieniach w kursie SQL na tym blogu) :)

Brak komentarzy:

Prześlij komentarz