Zu Oracle

Bereich:
Versionsinfo:
PL/SQL
9.2, 10.2, 11.1
Erstellung:
Letzte Überarbeitung:
02/2001 HA
06/2009 EF
 Als PDF Downloaden!

Trigger auf DDL- und Systemereignisse

Neben den recht bekannten DML-Triggern, die z.B.  auf Inserts, Update und Deletes in Datenbank-Tabellen reagieren, gibt es in Oracle auch Trigger, die bei DDL-Ereignissen wie create, alter, drop .. bzw. DCL-Befehlen wie Grant und Revoke feuern. Zudem kann man Trigger auf Systemereignisse wie SHUTDOWN, LOGON o.ä. definieren.
 
DDL-Ereignisse können mit einem Trigger vom folgenden Typ erfasst werden:

CREATE OR REPLACE TRIGGER trigger_name
  BEFORE | AFTER <DDL/DCL> ON SCHEMA | DATABASE
...

wobei als DDL/DCL-Schlüsselwort folgende Befehle verwendet werden können: CREATE , ALTER, DROP, RENAME, TRUNCATE, ANALYZE, ASSOCIATE STATISTICS, DISASSOCIATE STATISTICS, AUDIT, NOAUDIT, COMMENT, GRANT, REVOKE

Für Systemereignis-Trigger kann man die folgende Syntax verwenden.

CREATE OR REPLACE TRIGGER trigger_name
  BEFORE | AFTER <system-event> ON SCHEMA | DATABASE

mögliche Werte von system-event: AFTER LOGON, BEFORE LOGOFF, AFTER SERVERERROR, AFTER STARTUP, BEFORE SHUTDOWN, AFTER SUSPEND, AFTER DB_ROLE_CHANGE

Für die Erstellung eines dieser Trigger braucht ein Entwickler das Recht ADMINISTER DATABASE TRIGGER

Vorsicht bei AFTER LOGON-Triggern!  Sollten sie einen Fehler enthalten, der den Trigger zum Absturz bringt, dann kann sich niemand mehr einloggen (Ausnahme: SYSDBA)!Ein AFTER SUSPEND-Trigger zündet, wenn eine "Resumable Transaction" aufgrund von Speicherplatzproblemen unterbrochen wurde. Weitere Einzelheiten dazu finden Sie HIER (Link einbauern !!!). AFTER_DB_ROLE_CHANGE bezieht sich auf den Wechsel der Datenbankrolle (Primär bzw. standby) bei switch-over und fail-over-Events (dazu muss Data Guard implemetiert sein). Der Trigger zündet, wenn die Datenbank nach dem Switch das erste Mal wieder geöffnet wird.

Trigger-Attribute

Je nach Triggertyp stehen innerhalb des Triggerbodies verschiedene Attribute ( = standalone Functions) zur Verfügung. Diese Funktionen müssen mit sys. oder ora_<funktionsname> angesprochen werden.

bei allen Triggertypen sind verfügbar:

  • sysevent (Typ VARCHAR2(20)):  Trigger-auslösendes Ereignis
  • instance_num (Typ NUMBER):  Nummer der Instanz (bei Parallel Server von Interesse)
  • database_name (Typ VARCHAR2(50)): Name der Datenbank
  • login_user (Typ VARCHAR2(30)): Name des Users, der Trigger ausgelöst hat
  • server_error_depth (Typ BINARY_INTEGER): Gibt die Tiefe des Error stacks zurück
  • server_error_msg (n) (Typ VARCHAR2): Gibt die Fehlermeldung an Position n des Error stacks zurück
  • server_error_num_params (n) (Typ BINARY_INTEGER): Gibt die Anzahl der ersetzten Wildcards bei der Fehlermeldung an Position n des Error stacks zurück
  • server_error_param (n, x) (Typ VARCHAR2): Gibt den Wert zurück, der anstelle der x-ten Wildcard  bei der Fehlermeldung an Position n des Error stacks eingesetzt wurde
  • space_error_info (err_number   OUT NUMBER, 
                      err_type     OUT VARCHAR2, 
                      obj_owner    OUT VARCHAR2, 
                      tablespace   OUT VARCHAR2,
                      obj_name     OUT VARCHAR2,
                      sub_obj_name OUT VARCHAR2) (Typ BOOLEAN):
    Gibt TRUE zurück, falls ein Fehler wegen Platzmangel auf einem Tablespace auftrat. Zusätzlich werden Informationen über das Objekt geliefert, das den Fehler verursacht hat. Dieses Attribut ist v.a. gedacht für den Einsatz in AFTER SUSPEND-Triggern, ist aber auch in AFTER SERVERERROR-Triggern zulässig.
  • sql_txt(sqltext OUT ora_name_list_t) (Typ BINARY_INTEGER):  In sqltext findet sich der Text der SQL-Anweisung, die den Trigger gezündet hat. Falls nötig, wird er in mehrere Teile gestückelt. Gibt Anzahl Teile(= Einträge in sqltext) zurück.

 nur bei SERVERERROR-Triggern:

  • server_error(n) (Typ NUMBER): Gibt die Fehlernummer an der Position n im errorstack zurück
  • is_servererror(n) (Typ BOOLEAN): Gibt TRUE zurück, falls der Fehler mit der Fehlernummer n aufgetreten ist

nur bei Triggern auf DDL-Ereignisse:

  • dictionary_obj_name (Typ VARCHAR2(30)): Name des Objekts, das erstellt, geändert oder gelöscht wurde
  • dictionary_obj_owner (Typ VARCHAR2(30)): Eigentümer des Objekts, das erstellt, geändert oder gelöscht wurde
  • dictionary_obj_type (Typ VARCHAR2(20)): Typ des Objekts, das erstellt, geändert oder gelöscht wurde
  • des_encrypted_password (Typ VARCHAR2): Bei einem CREATE USER oder ALTER USER-Befehl: das DES-verschlüsselte Password des betreffenden Users

Nur bei LOGON-Triggern:

  • client_ip_address (Typ VARCHAR2):  Gibt IP-Adresse des Client zurück, falls Verbindung über TCP/IP läuft.

Nur bei CREATE TABLE-Triggern:

  • is_creating_nested_table (Typ BOOLEAN): Gibt TRUE zurück, falls eine nested table angelegt wurde

Nur bei ALTER TABLE-Triggern:

  • is_alter_column(spaltenname) (Typ BOOLEAN): Gibt TRUE zurück, falls angegebene Spalte geändert wurde wurde
  • is_drop_column(spaltenname) (Typ BOOLEAN): Gibt TRUE zurück, falls angegebene Spalte gelöscht wurde wurde

Nur bei DCL-Triggern

  • grantee(user_list OUT ora_name_list_t) (Typ BINARY_INTEGER): Gibt bei GRANT-Triggern Anzahl der Grantees zurück; in user_list finden sich zusätzlich deren Namen
  • revokee(user_list OUT ora_name_list_t) (Typ BINARY_INTEGER): Gibt bei REVOKE-Triggern Anzahl der User zurück, denen Rechte entzogen wurden; in user_list finden sich zusätzlich deren Namen
  • privilege_list(priv_list OUT ora_name_list_t) (Typ BINARY_INTEGER): Gibt Anzahl der Privilegien zurück, die erteilt bzw. entzogen wurden; in priv_list finden sich zusätzlich deren Namen
  • with_grant_option(Typ BOOLEAN): Nur bei GRANT-Triggern. Gibt TRUE zurück, falls Privileg mit Grant Option erteilt wurde

Nur bei ASSOCIATE / DISASSOCIATE STATISTICS-Triggern.

  • dict_obj_name_list(name_list OUT ora_name_list_t) (Typ BINARY_INTEGER):  Gibt Anzahl der Objekte zurück, die geändert wurden; in name_list finden sich zusätzlich deren Namen
  • dict_obj_owner_list(name_list OUT ora_name_list_t) (Typ BINARY_INTEGER): Nur bei ASSOCIATE / DISASSOCIATE STATISTICS-Triggern. Gibt Anzahl der Eigentümer zurück, deren Objekte geändert wurden; in name_list finden sich zusätzlich deren Namen

Der Datentyp ora_name_list_t ist im DBMS_STANDARD-Package definiert als TABLE OF VARCHAR2(64)

Suche

Kontakt

Telefon:
  089 6228 6789-0

Telefon (gültig bis Ende 2010):
  089 679090-40

E-Mail Verteiler Monatstipps

Bitte nehmen Sie mich in den Verteiler der monatlichen Tipps & Tricks auf.