Trigger erstellen
Um TRIGGER zu erstellen, verwenden Sie entweder die grafische Benutzeroberfläche von SQL Developer oder die DDL-Anweisung CREATE TRIGGER.
In dem vorliegenden Abschnitt wird gezeigt, wie Sie mit diesen beiden Methoden Trigger 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 auszuführen, muss das Beispielschema hr installiert sein, und Sie müssen über SQL Developer mit der Datenbank als Benutzer HR verbunden sein.
Siehe:
-
Oracle AI Database PL/SQL Language Reference (Weitere Informationen zur Anweisung CREATE TRIGGER)
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:
-
Bei einem INSERT-Trigger enthält OLD keine Werte, und NEW die neuen Werte.
-
Bei einem UPDATE-Trigger enthält OLD die alten Werte, und NEW die neuen Werte.
-
Bei einem DELETE-Trigger enthält OLD die alten Werte, und NEW keine Werte.
Um einen Pseudodatensatz zu referenzieren, setzen Sie einen Doppelpunkt vor seinen Namen -:OLD oder :NEW- wie in Beispiel 6-1.
Siehe auch: Oracle AI Database PL/SQL Language Reference für weitere Informationen über alte und neue Pseudorecords
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ühren 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:
-
Erstellen Sie die EVALUATIONS_LOG-Tabelle:
CREATE TABLE EVALUATIONS_LOG ( log_date DATE , action VARCHAR2(50)); -
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 auch: Oracle AI Database PL/SQL Language Reference für weitere Informationen zu bedingten Prädikaten
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.
So erstellen Sie den Trigger NEW_EVALUATION:
-
Blenden Sie im Schritt "Verbindungen" hr_conn ein.
-
Klicken Sie in der Liste der Schemaobjekttypen mit der rechten Maustaste auf Trigger.
-
Klicken Sie in der Liste der Auswahlmöglichkeiten auf Neuer Trigger.
-
Gehen Sie im Fenster {\b Create Trigger} wie folgt vor:
-
Geben Sie im Feld "Name" den Standardwert mit der Zeichenfolge TRIGGER1 NEW_EVALUATION_TRIGGER ein.
-
Wählen Sie für das Basisobjekt EVALUATIONS aus dem Menü.
-
Verschieben Sie INSERT von "Verfügbare Events" in "Ausgewählte Events".
(Wählen Sie INSERT, und klicken Sie auf >.)
-
Deaktivieren Sie die Option "Auszugsebene".
-
Klicken Sie auf "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.
-
-
Ersetzen Sie in der Anweisung CREATE TRIGGER die Zeichenfolge NULL mit folgender Zeichenfolge:
:NEW.evaluation_id := evaluations_sequence.NEXTVAL -
Wählen Sie im Menü "Datei" die Option Speichern.
Die Datenbank 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:
-
Oracle AI Database PL/SQL Language Reference für weitere Informationen zu INSTEAD OF-Triggern
-
Oracle AI Database PL/SQL Language Reference für weitere Informationen zu OLD und NEW
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.
So erstellen Sie HR_USERS_LOG, HR_LOGON_TRIGGER und HR_LOGOFF_TRIGGER:
-
Erstellen Sie die Tabelle HR_USERS_LOG:
CREATE TABLE hr_users_log ( user_name VARCHAR2(30), activity VARCHAR2(20), event_date DATE ); -
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; -
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 auch: Oracle AI Database PL/SQL Language Reference für weitere Informationen zu Systemtriggern