=====PL/SQL Instrumentation - in der V$SESSION Informationen über die aktuelle Session / das aktuelle Programm hinterlegen===== **min. Ab V7** Nur wenn wir erkennen können was gerade in der Datenbank läuft, fällt es leicht auf bei Problemen schnell zu reagieren. Wird später mit ASH die Last auf der DB ausgewertet, dienen diese Informationen wie MODULE dazu zu erkennen welche Teile der Applikation wie viel Ressourcen auf der Datenbank verbraucht haben. ==== Wie kann nun eine Oracle Session in der Datenbank markiert werden?==== In der View V$SESSION stehen uns dazu die folgende Spalten zur Verfügung: * MODULE VARCHAR2(64) * ACTION VARCHAR2(64) * CLIENT_IDENTIFIER VARCHAR2(64) * CLIENT_INFO VARCHAR2(64) Setzen der Session Information per PL/SQL Aufruf (zum Beispiel vor dem Aufruf des eigentlichen SQL Statements): --Set the session information in v$session: begin -- set v$session module -- set v$session action dbms_application_info.set_module('CALL_FROM_TEST', 'AAA'); -- set v$session client_info dbms_application_info.set_client_info('BBB'); -- set v$session client_identifier dbms_session.set_identifier('CCC'); end; / Abfragen der gesetzten Informationen (hier die eigene Session): column module format a20 column action format a20 column client_info format a20 column client_identifier format a20 -- select your own session: select module , action , client_info , client_identifier from gv$session where sid = sys_context('userenv','SID') and inst_id= sys_context('userenv','INSTANCE') / MODULE ACTION CLIENT_INFO CLIENT_IDENTIFIER -------------------- -------------------- -------------------- -------------------- CALL_FROM_TEST AAA BBB CCC Diese Informationen werden auch in den Audit Trail der DB mit übernommen. In einer typischen PL/SQL Umgebung sollte dazu ein Package definiert werden, über das diese Informationen gezielt in jeden Package gesetzt werden. === Nachträglich Informationen hinterlegen === Oft ist es recht schwer Entwickler oder gar Software Firmen wie Oracle zu überzeugen, das durch eine durchgängige Instrumentation des SQL Codes eine stark verbesserte Wartbarkeit erzeugt werden kann. Bei bestehenden Applikationen ist das natürlich nachträglich nicht mehr möglich. Eine Idee ist das Setzen eines Trigger auf die Log Tabellen einer Applikation, startet der Batchlauf und trägt sich in der Log Tabelle ein, wird für diese Session die Information dazu auch in die V$Session übertragen. ==== Quellen ==== Oracle: * Using DBMS_APPLICATION_INFO => http://docs.oracle.com/database/121/ARPLS/d_appinf.htm#ARPLS65225 * Using DBMS_SESSION => http://docs.oracle.com/database/121/ARPLS/d_sessio.htm#ARPLS68063 * SYS_CONTEXT => http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions184.htm