Datenbank-Trigger zur Fehlersuche

Bei Fremdanwendungen mit unzugänglichem Code oder auch für ein schnelles Eingrenzen von Fehlern unbekannter Herkunft kann unter Zuhilfenahme einiger, neuerer Trigger-Features ganz bequem mit einem autonomen Schema- oder Database-Trigger ein Logging ausgelöst werden. Der folgende Code protokolliert einen Fehler mit seinem Errorstack und dem zugehörigen SQL und kann damit auch zum Logging von SQL-Exceptions genutzt werden:

DROP TABLE servererror_log
/
CREATE TABLE servererror_log (
  error_datetime TIMESTAMP,
, error_user VARCHAR2(30)
, error_stack VARCHAR2(2000)
, error_backtrace VARCHAR2(4000)
, captured_sql VARCHAR2(4000))
/
CREATE OR REPLACE
TRIGGER log_server_errors
AFTER SERVERERROR
ON SCHEMA -- oder auch "ON DATABASE"
DECLARE
  PRAGMA autonomous_transaction;
  sql_text DBMS_STANDARD.ora_name_list_t;
  n PLS_INTEGER;
  v_stmt VARCHAR2(4000);
BEGIN
  -- Das problematische SQL...
  n := ora_sql_txt(sql_text);
  -- ... besteht ggf. aus mehreren Teilen und wird in einer Schleife wieder zusammengefügt
  FOR i IN 1..n LOOP
    v_stmt := v_stmt || sql_text(i);
  END LOOP;

  INSERT INTO servererror_log
   ( error_datetime
   , error_user
   , error_stack
   , error_backtrace
   , captured_sql )
  VALUES
   ( systimestamp
   , sys.login_user
   , dbms_utility.format_error_stack
   , dbms_utility.format_error_backtrace
   , v_stmt );
  COMMIT;
END log_server_errors;
/
Anmerkung: Dieser Beispielcode ist nicht für den Einsatz in produktiven Umgebungen konzipiert worden!

Hier noch ein paar Links zu den im Beispiel benutzten Features:

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s