Trigger erstellen

Um TRIGGER zu erstellen, verwenden Sie entweder die grafische Benutzeroberfläche von SQL Developer oder die DDL-Anweisung CREATE TRIGGER.

In dem folgenden Abschnitt wird erläutert, wie Sie Trigger auf beide Arten erstellen.

Standardmäßig wird ein Trigger in aktiviertem Zustand erstellt. Wenn ein TRIGGER in deaktiviertem Zustand erstellt werden soll, muss die Anweisung CREATE TRIGGER zusammen mit der Klausel DISABLE verwendet werden.

Hinweis: Für das Erstellen von Triggern benötigen Sie die entsprechenden Berechtigungen. Für den Fall mit seiner einfachen Anwendung sind diese zusätzlichen Informationen jedoch nicht erforderlich.

Hinweis: Um die Tutorials in diesem Dokument ausführen zu können, müssen Sie über SQL Developer als Benutzer HR mit Oracle Database verbunden sein.

Siehe:

Pseudodatensätze OLD und NEW

Wenn ein Trigger auf Zeilenebene ausgelöst werden, erstellt und füllt das PL/SQL-Laufzeitsystem die beiden Pseudodatensätze OLD und NEW. Sie werden als Pseudodatensätze bezeichnet, da sie über viele, aber nicht alle, Eigenschaften von Datensätzen verfügen.

Für die Zeile, die der Trigger verarbeitet, gilt:

Um einen Pseudodatensatz zu referenzieren, setzen Sie einen Doppelpunkt vor seinen Namen -:OLD oder :NEW- wie in Beispiel 6-1.

Siehe auch: Oracle Database PL/SQL Language Reference für weitere Informationen zu alten und neuen Pseudorecorden

Tutorial: Einen Trigger erstellen, der Tabellenänderungen protokolliert

In diesem Tutorial wird erläutert, wie die Anweisung CREATE TRIGGER zur Erstellung eines Triggers, der Anweisung EVAL_CHANGE_TRIGGER, verwendet werden kann. Diese Anweisung fügt der Tabelle EVALUATIONS_LOG eine Zeile hinzu, wenn eine INSERT-, UPDATE- oder DELETE-Anweisung die Tabelle EVALUATIONS ändert.

Der Trigger fügt die Zeile nach der Ausführung der Triggeranweisung ein und verwendet die Bedingungsprädikate INSERTING, UPDATING und DELETING, um festzulegen, welche der drei möglichen DML-Anweisungen den Trigger ausgelöst haben.

EVAL_CHANGE_TRIGGER ist ein Trigger auf Anweisungsebene und ein AFTER-Trigger.

So erstellen Sie ein EVALUATIONS_LOG und einen EVAL_CHANGE_TRIGGER:

  1. Erstellen Sie die EVALUATIONS_LOG-Tabelle:

     CREATE TABLE EVALUATIONS_LOG ( log_date DATE
                                 , action VARCHAR2(50));
    
  2. EVAL_CHANGE_TRIGGER erstellen:

     CREATE OR REPLACE TRIGGER EVAL_CHANGE_TRIGGER
    
       AFTER INSERT OR UPDATE OR DELETE
       ON EVALUATIONS
     DECLARE
       log_action  EVALUATIONS_LOG.action%TYPE;
     BEGIN
       IF INSERTING THEN
         log_action := 'Insert';
       ELSIF UPDATING THEN
         log_action := 'Update';
       ELSIF DELETING THEN
         log_action := 'Delete';
       ELSE
         DBMS_OUTPUT.PUT_LINE('This code is not reachable.');
       END IF;
    
       INSERT INTO EVALUATIONS_LOG (log_date, action)
         VALUES (SYSDATE, log_action);
     END;
    

Siehe: Oracle Database PL/SQL-Sprachreferenz, um weitere Informationen zu bedingten Prädikaten zu erhalten

Tutorial: Trigger erstellen, der vor dem Einfügen der Zeile einen Primärschlüssel generiert

In diesem Tutorial wird gezeigt, wie Sie mit dem Tool "Trigger erstellen" von SQL Developer einen Trigger erstellen, der ausgelöst wird, bevor eine Zeile in die Tabelle EVALUATIONS eingefügt wird. Außerdem wird mit EVALUATIONS_SEQUENCE die eindeutige Nummer für den Primärschlüssel dieser Zeile generiert.

Die Sequenz EVALUATIONS_SEQUENCE (erstellt in "Tutorial: Sequenz erstellen") generiert Primärschlüssel für die Tabelle EVALUATIONS (erstellt in). Diese Primärschlüssel werden jedoch nicht automatisch in die Tabelle eingefügt.

In diesem Tutorial wird gezeigt, wie Sie mit dem SQL Developer-Tool "Trigger erstellen" einen Trigger namens NEW_EVALUATION_TRIGGER erstellen, der ausgelöst wird, bevor eine Zeile in die Tabelle EVALUATIONS eingefügt wird, und die eindeutige Nummer für den Primärschlüssel dieser Zeile mit EVALUATIONS_SEQUENCE generiert. Der Trigger wird einmal aus, für jede Zeile, die von der auslösenden INSERT-Anweisung betroffen sind.

NEW_EVALUATION_TRIGGER ist ein Trigger auf Zeilenebenen und ein BEFORE-Trigger.

Schritte zum Erstellen des Triggers NEW_EVALUATION:

  1. Blenden Sie im Schritt "Verbindungen" hr_conn ein.

  2. Klicken Sie in der Liste der Schemaobjekttypen mit der rechten Maustaste auf Trigger.

  3. Wählen Sie in der Auswahlliste Neuer Trigger aus.

  4. Gehen Sie im Fenster {\b Create Trigger} wie folgt vor:

    1. Geben Sie im Feld "Name" den Standardwert mit der Zeichenfolge TRIGGER1 NEW_EVALUATION_TRIGGER ein.

    2. Wählen Sie für das Basisobjekt im Menü die Option EVALUATIONS aus.

    3. Verschieben Sie INSERT von "Verfügbare Ereignisse" in "Ausgewählte Ereignisse".

      (Wählen Sie INSERT und dann >.)

    4. Heben Sie die Auswahl der Option Auszugsebene auf.

    5. Wählen Sie OK.

      Der Bereich NEW_EVALUATION_TRIGGER wird geöffnet und zeigt die Anweisung CREATE TRIGGER an, die den TRIGGER erstellt hat:

       CREATE OR REPLACE
      
       TRIGGER NEW_EVALUATION_TRIGGER
      
       BEFORE INSERT ON EVALUATIONS
      
       FOR EACH ROW
      
       BEGIN
      
         NULL;
      
       END;
      

      Der Titel des Bereichs NEW_EVALUATION_TRIGGER wird in kursivschrift angezeigt, um zu kennzeichnen, dass der Trigger noch nicht in der Datenbank gespeichert ist.

  5. Ersetzen Sie in der Anweisung CREATE TRIGGER die Zeichenfolge NULL mit folgendem Text:

     :NEW.evaluation_id := evaluations_sequence.NEXTVAL
    
  6. Wählen Sie im Menü "Datei" die Option Speichern.

    Oracle Database kompiliert die Prozedur und speichert sie. Der Titel des Fensterbereichs NEW_EVALUATION_TRIGGER wird nicht mehr in Kursivschrift dargestellt.

Einen INSTEAD OF-Trigger erstellen

Eine View stellt die Ausgabe einer Abfrage als Tabelle dar. Wenn Sie eine View wie eine Tabelle ändern wollen, müssen Sie INSTEAD OF-Trigger erstellen. Diese Trigger ändern nicht die View, sondern die zugrunde liegenden Tabellen.

Beispiel: Die View EMP_LOCATIONS, deren Spalte NAME aus den Spalten LAST_NAME und FIRST_NAME der Tabelle EMPLOYEES erstellt wurde:

CREATE VIEW EMP_LOCATIONS AS
SELECT e.EMPLOYEE_ID,
  e.LAST_NAME || ', ' || e.FIRST_NAME NAME,
  d.DEPARTMENT_NAME DEPARTMENT,
  l.CITY CITY,
  c.COUNTRY_NAME COUNTRY
FROM EMPLOYEES e, DEPARTMENTS d, LOCATIONS l, COUNTRIES c
WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID AND
 d.LOCATION_ID = l.LOCATION_ID AND
 l.COUNTRY_ID = c.COUNTRY_ID
ORDER BY LAST_NAME;

Um die Ansicht EMP_LOCATIONS.NAME (erstellt unter "Ansichten mit der Anweisung CREATE VIEW erstellen") zu aktualisieren, müssen Sie EMPLOYEES.LAST_NAME und EMPLOYEES.FIRST_NAME aktualisieren. So funktioniert der Trigger INSTEAD OF in Beispiel 6-1.

NEW und OLD sind Pseudodatensätze, die von der PL/SQL-Runtime Engine bei Auslösen eines Triggers auf Zeilenebene erstellt und aufgefüllt werden. ALT und NEU speichern die ursprünglichen bzw. neuen Werte des Datensatzes, der vom Trigger verarbeitet wird. Sie werden als Pseudodatensätze bezeichnet, weil sie nicht sämtliche Eigenschaften der PL/SQL-Datensätze besitzen.

Beispiel 6-1: INSTEAD OF-Trigger erstellen

CREATE OR REPLACE TRIGGER update_name_view_trigger
INSTEAD OF UPDATE ON emp_locations
BEGIN
  UPDATE employees SET
    first_name = substr( :NEW.name, instr( :new.name, ',' )+2),
    last_name = substr( :NEW.name, 1, instr( :new.name, ',')-1)
  WHERE employee_id = :OLD.employee_id;
END;

Siehe:

Tutorial: Trigger erstellen, die LOGON- und LOGOFF-Ereignisse protokollieren

In diesem Tutorial wird gezeigt, wie Sie mit der Anweisung CREATE TRIGGER zwei TRIGGER erstellen, HR_LOGON_TRIGGER und HR_LOGOFF_TRIGGER. Nach der Anmeldung als Benutzer HR fügt HR_LOGON_TRIGGER der Tabelle HR_USERS_LOG eine Zeile hinzu. Bevor sich jemand als HR-Benutzer abmeldet, fügt HR_LOGOFF_TRIGGER eine Zeile in die Tabelle HR_USERS_LOG ein.

HR_LOGON_TRIGGER und HR_LOGOFF_TRIGGER sind Systemtrigger. HR_LOGON_TRIGGER ist ein AFTER-Trigger und HR_LOGOFF_TRIGGER ist ein BEFORE-Trigger.

Schritte zum Erstellen von HR_USERS_LOG, HR_LOGON_TRIGGER und HR_LOGOFF_TRIGGER:

  1. Erstellen Sie die Tabelle HR_USERS_LOG:

     CREATE TABLE hr_users_log (
       user_name VARCHAR2(30),
       activity VARCHAR2(20),
       event_date DATE
     );
    
  2. HR_LOGON_TRIGGER erstellen:

     CREATE OR REPLACE TRIGGER hr_logon_trigger
    
       AFTER LOGON
    
       ON HR.SCHEMA
     BEGIN
       INSERT INTO hr_users_log (user_name, activity, event_date)
       VALUES (USER, 'LOGON', SYSDATE);
     END;
    
  3. HR_LOGOFF_TRIGGER erstellen:

     CREATE OR REPLACE TRIGGER hr_logoff_trigger
    
       BEFORE LOGOFF
    
       ON HR.SCHEMA
     BEGIN
       INSERT INTO hr_users_log (user_name, activity, event_date)
       VALUES (USER, 'LOGOFF', SYSDATE);
     END;
    

Siehe: Oracle Database PL/SQL-Sprachreferenz, um weitere Informationen zu Systemtriggern zu erhalten