Oracle PL/SQL-Trigger-Tutorial: Statt Compound [Beispiel]
Was ist Trigger in PL/SQL?
LรST AUS sind gespeicherte Programme, die von abgefeuert werden Oracle Engine automatisch, wenn DML-Anweisungen wie Einfรผgen, Aktualisieren, Lรถschen fรผr die Tabelle ausgefรผhrt werden oder bestimmte Ereignisse auftreten. Der Code, der im Falle eines Triggers ausgefรผhrt werden soll, kann je nach Anforderung definiert werden. Sie kรถnnen das Ereignis auswรคhlen, bei dem der Auslรถser ausgelรถst werden soll, sowie den Zeitpunkt der Ausfรผhrung. Der Zweck des Triggers besteht darin, die Integritรคt der Informationen in der Datenbank aufrechtzuerhalten.
Vorteile von Triggern
Im Folgenden sind die Vorteile von Triggern aufgefรผhrt.
- Einige abgeleitete Spaltenwerte werden automatisch generiert
- Durchsetzung der referenziellen Integritรคt
- Ereignisprotokollierung und Speicherung von Informationen zum Tabellenzugriff
- Auditing
- SyncChronische Replikation von Tabellen
- Auferlegen von Sicherheitsberechtigungen
- Ungรผltige Transaktionen verhindern
Arten von Auslรถsern in Oracle
Auslรถser kรถnnen anhand der folgenden Parameter klassifiziert werden.
- Klassifizierung basierend auf der zeitliche Koordinierung
- VOR dem Auslรถser: Wird ausgelรถst, bevor das angegebene Ereignis eingetreten ist.
- NACH Trigger: Wird ausgelรถst, nachdem das angegebene Ereignis aufgetreten ist.
- STATT Trigger: Ein besonderer Typ. Zu den weiteren Themen erfahren Sie mehr. (nur fรผr DML)
- Klassifizierung basierend auf der Grad des
- Auslรถser auf STATEMENT-Ebene: Er wird einmal fรผr die angegebene Ereignisanweisung ausgelรถst.
- Auslรถser auf Zeilenebene: Er wird fรผr jeden Datensatz ausgelรถst, der von dem angegebenen Ereignis betroffen war. (nur fรผr DML)
- Klassifizierung basierend auf der Event
- DML-Trigger: Wird ausgelรถst, wenn das DML-Ereignis angegeben wird (INSERT/UPDATE/DELETE).
- DDL-Trigger: Wird ausgelรถst, wenn das DDL-Ereignis angegeben wird (CREATE/ALTER).
- DATABASE-Trigger: Wird ausgelรถst, wenn das Datenbankereignis angegeben wird (LOGON/LOGOFF/STARTUP/SHUTDOWN).
Jeder Auslรถser ist also die Kombination der oben genannten Parameter.
So erstellen Sie einen Trigger
Nachfolgend finden Sie die Syntax zum Erstellen eines Triggers.
CREATE [ OR REPLACE ] TRIGGER <trigger_name> [BEFORE | AFTER | INSTEAD OF ] [INSERT | UPDATE | DELETE......] ON<name of underlying object> [FOR EACH ROW] [WHEN<condition for trigger to get execute> ] DECLARE <Declaration part> BEGIN <Execution part> EXCEPTION <Exception handling part> END;
Syntaxerklรคrung:
- Die obige Syntax zeigt die verschiedenen optionalen Anweisungen, die bei der Triggererstellung vorhanden sind.
- BEFORE/AFTER legt den Zeitpunkt des Ereignisses fest.
- EINFรGEN/AKTUALISIEREN/ANMELDUNG/ERSTELLEN/etc. gibt das Ereignis an, fรผr das der Trigger ausgelรถst werden muss.
- Die ON-Klausel gibt an, fรผr welches Objekt das oben genannte Ereignis gรผltig ist. Dies ist beispielsweise der Tabellenname, in dem das DML-Ereignis im Fall von DML-Trigger auftreten kann.
- Der Befehl โFOR EACH ROWโ legt den Auslรถser fรผr die Zeilenebene fest.
- Die WHEN-Klausel gibt die zusรคtzliche Bedingung an, unter der der Trigger ausgelรถst werden muss.
- Der Deklarationsteil, der Ausfรผhrungsteil und der Ausnahmebehandlungsteil sind mit denen der anderen identisch PL/SQL-Blรถcke. Der Deklarationsteil und der Ausnahmebehandlungsteil sind optional.
:NEW- und :OLD-Klausel
Bei einem Trigger auf Zeilenebene wird der Trigger fรผr jede zugehรถrige Zeile ausgelรถst. Und manchmal ist es erforderlich, den Wert vor und nach der DML-Anweisung zu kennen.
Oracle hat im Trigger auf RECORD-Ebene zwei Klauseln bereitgestellt, um diese Werte zu speichern. Mit diesen Klauseln kรถnnen wir auf die alten und neuen Werte im Triggerkรถrper verweisen.
- :NEW โ Es enthรคlt einen neuen Wert fรผr die Spalten der Basistabelle/-ansicht wรคhrend der Triggerausfรผhrung
- :OLD โ Es enthรคlt den alten Wert der Spalten der Basistabelle/-ansicht wรคhrend der Triggerausfรผhrung
Diese Klausel sollte basierend auf dem DML-Ereignis verwendet werden. Die folgende Tabelle gibt an, welche Klausel fรผr welche DML-Anweisung gรผltig ist (INSERT/UPDATE/DELETE).
| INSERT | AKTUALISIEREN | LรSCHEN | |
|---|---|---|---|
| :NEU | GรLTIG | GรLTIG | UNGรLTIG. Im Lรถschfall gibt es keinen neuen Wert. |
| :ALT | UNGรLTIG. Es gibt keinen alten Wert im Einfรผgefall | GรLTIG | GรLTIG |
STATT Auslรถser
โINSTEAD OF Triggerโ ist der spezielle Triggertyp. Er wird nur in DML-Triggern verwendet. Er wird verwendet, wenn ein DML-Ereignis in der komplexen Ansicht auftreten soll.
Betrachten Sie ein Beispiel, in dem eine Ansicht aus drei Basistabellen erstellt wird. Wenn รผber diese Ansicht ein DML-Ereignis ausgegeben wird, wird dieses ungรผltig, da die Daten aus drei verschiedenen Tabellen stammen. In diesem Fall wird also INSTEAD OF-Trigger verwendet. Der INSTEAD OF-Trigger wird verwendet, um die Basistabellen direkt zu รคndern, anstatt die Ansicht fรผr das gegebene Ereignis zu รคndern.
Beispiel 1: In diesem Beispiel erstellen wir eine komplexe Ansicht aus zwei Basistabellen.
- Tabelle_1 ist emp-Tabelle und
- Table_2 ist eine Abteilungstabelle.
Dann werden wir sehen, wie der INSTEAD OF-Trigger verwendet wird, um die UPDATE-Anweisung fรผr die Standortdetails in dieser komplexen Ansicht auszugeben. Wir werden auch sehen, wie :NEW und :OLD in Triggern nรผtzlich sind.
- Schritt 1: Erstellen Sie die Tabellen โempโ und โdeptโ mit den entsprechenden Spalten
- Schritt 2: Fรผllen der Tabelle mit Beispielwerten
- Schritt 3: Ansicht fรผr die oben erstellte Tabelle erstellen
- Schritt 4: Aktualisierung der Ansicht vor dem Statt-Trigger
- Schritt 5: Erstellung des Statt-Triggers
- Schritt 6: Aktualisierung der Ansicht nach dem Auslรถsen
Schritt 1) Erstellen der Tabellen โempโ und โdeptโ mit entsprechenden Spalten
CREATE TABLE emp( emp_no NUMBER, emp_name VARCHAR2(50), salary NUMBER, manager VARCHAR2(50), dept_no NUMBER); / CREATE TABLE dept( Dept_no NUMBER, Dept_name VARCHAR2(50), LOCATION VARCHAR2(50)); /
Code Erlรคuterung
- Code Zeile 1-7: Erstellung der Tabelle โempโ.
- Code Zeile 8-12: Erstellung der Tabelle โAbteilungโ.
Ausgang
Tabelle erstellt
Schritt 2) Da wir nun die Tabelle erstellt haben, werden wir diese Tabelle mit Beispielwerten und der Erstellung von Ansichten fรผr die oben genannten Tabellen fรผllen.
BEGIN INSERT INTO DEPT VALUES(10,โHRโ,โUSAโ); INSERT INTO DEPT VALUES(20,'SALES','UKโ); INSERT INTO DEPT VALUES(30,โFINANCIAL',โJAPAN'); COMMIT; END; / BEGIN INSERT INTO EMP VALUES(1000,'XXX5,15000,'AAA',30); INSERT INTO EMP VALUES(1001,โYYY5,18000,โAAAโ,20) ; INSERT INTO EMP VALUES(1002,โZZZ5,20000,โAAA',10); COMMIT; END; /
Code Erlรคuterung
- Code Zeile 13-19: Daten werden in die Tabelle โdeptโ eingefรผgt.
- Code Zeile 20-26: Einfรผgen von Daten in die Tabelle โempโ.
Ausgang
PL/SQL-Prozedur fertiggestellt
Schritt 3) Erstellen einer Ansicht fรผr die oben erstellte Tabelle.
CREATE VIEW guru99_emp_view( Employee_name:dept_name,location) AS SELECT emp.emp_name,dept.dept_name,dept.location FROM emp,dept WHERE emp.dept_no=dept.dept_no; /
SELECT * FROM guru99_emp_view;
Code Erlรคuterung
- Code Zeile 27-32: Erstellung der Ansicht โguru99_emp_viewโ.
- Code Zeile 33: Abfrage von guru99_emp_view.
Ausgang
Ansicht erstellt
| MITARBEITERNAME | DEPT_NAME | STANDORT |
|---|---|---|
| ZZZ | HR | USA |
| Yyy | Angebote | UK |
| XXX | FINANCIAL | JAPAN |
Schritt 4) Aktualisierung der Ansicht vor statt Auslรถser.
BEGIN UPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name=:'XXXโ; COMMIT; END; /
Code Erlรคuterung
- Code Zeile 34-38: Aktualisieren Sie den Standort von โXXXโ auf โFRANKREICHโ. Die Ausnahme wurde ausgelรถst, weil die DML-Anweisungen sind in der komplexen Ansicht nicht zulรคssig.
Ausgang
ORA-01779: Eine Spalte, die einer nicht schlรผsselerhaltenen Tabelle zugeordnet ist, kann nicht geรคndert werden
ORA-06512: in Zeile 2
Schritt 5)Um den Fehler zu vermeiden, der beim Aktualisieren der Ansicht im vorherigen Schritt auftritt, verwenden wir in diesem Schritt โanstelle von Triggerโ.
CREATE TRIGGER guru99_view_modify_trg INSTEAD OF UPDATE ON guru99_emp_view FOR EACH ROW BEGIN UPDATE dept SET location=:new.location WHERE dept_name=:old.dept_name; END; /
Code Erlรคuterung
- Code Zeile 39: Erstellung eines INSTEAD OF-Triggers fรผr das Ereignis โUPDATEโ in der Ansicht โguru99_emp_viewโ auf ROW-Ebene. Es enthรคlt die Update-Anweisung zum Aktualisieren des Speicherorts in der Basistabelle โdeptโ.
- Code Zeile 44: Die Update-Anweisung verwendet โ:NEWโ und โ:OLDโ, um den Wert der Spalten vor und nach der Aktualisierung zu ermitteln.
Ausgang
Auslรถser erstellt
Schritt 6) Aktualisierung der Ansicht nach dem Statt-Auslรถser. Jetzt tritt der Fehler nicht mehr auf, da der โStatt-Auslรถserโ den Aktualisierungsvorgang dieser komplexen Ansicht รผbernimmt. Und wenn der Code ausgefรผhrt wurde, wird der Standort des Mitarbeiters XXX von โJapanโ auf โFrankreichโ aktualisiert.
BEGIN UPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX'; COMMIT; END; /
SELECT * FROM guru99_emp_view;
Code Erlรคuterung:
- Code Zeile 49-53: Aktualisierung des Standorts von โXXXโ auf โFRANKREICHโ. Dies ist erfolgreich, da der โINSTEAD OFโ-Trigger die eigentliche Aktualisierungsanweisung in der Ansicht gestoppt und die Aktualisierung der Basistabelle durchgefรผhrt hat.
- Code Zeile 55: รberprรผfen des aktualisierten Datensatzes.
Ausgang:
PL/SQL-Prozedur erfolgreich abgeschlossen
| MITARBEITERNAME | DEPT_NAME | STANDORT |
|---|---|---|
| ZZZ | HR | USA |
| Yyy | Angebote | UK |
| XXX | FINANCIAL | FRANKREICH |
Zusammengesetzter Trigger
Der zusammengesetzte Trigger ist ein Trigger, der es Ihnen ermรถglicht, Aktionen fรผr jeden der vier Zeitpunkte im einzelnen Triggerkรถrper festzulegen. Die vier verschiedenen Timing-Punkte, die es unterstรผtzt, sind wie folgt.
- VORHERIGE ERKLรRUNG โ Ebene
- VOR DER REIHE โ Ebene
- NACH REIHE โ Ebene
- NACH ERKLรRUNG โ Ebene
Es bietet die Mรถglichkeit, die Aktionen fรผr unterschiedliche Zeitpunkte in demselben Auslรถser zu kombinieren.
CREATE [ OR REPLACE ] TRIGGER <trigger_name> FOR [INSERT | UPDATE | DELET.......] ON <name of underlying object> <Declarative part>โญ โฌ BEFORE STATEMENT IS BEGIN <Execution part>; END BEFORE STATEMENT; BEFORE EACH ROW IS BEGIN <Execution part>; END EACH ROW; AFTER EACH ROW IS BEGIN <Execution part>; END AFTER EACH ROW; AFTER STATEMENT IS BEGIN <Execution part>; END AFTER STATEMENT; END;
Syntaxerklรคrung:
- Die obige Syntax zeigt die Erstellung des โCOMPOUNDโ-Triggers.
- Der deklarative Abschnitt ist fรผr alle Ausfรผhrungsblรถcke im Triggerkรถrper gleich.
- Diese 4 Timing-Blรถcke kรถnnen in beliebiger Reihenfolge vorliegen. Es ist nicht zwingend erforderlich, alle diese 4 Zeitblรถcke zu haben. Wir kรถnnen einen COMPOUND-Trigger nur fรผr die erforderlichen Timings erstellen.
Beispiel 1: In diesem Beispiel erstellen wir einen Auslรถser, um die Gehaltsspalte automatisch mit dem Standardwert 5000 zu fรผllen.
CREATE TRIGGER emp_trig FOR INSERT ON emp COMPOUND TRIGGER BEFORE EACH ROW IS BEGIN :new.salary:=5000; END BEFORE EACH ROW; END emp_trig; /
BEGIN INSERT INTO EMP VALUES(1004,โCCCโ,15000,โAAAโ,30); COMMIT; END; /
SELECT * FROM emp WHERE emp_no=1004;
Code Erlรคuterung:
- Code Zeile 2-10: Erstellung eines zusammengesetzten Triggers. Es wird fรผr die Zeitmessung BEFORE ROW-Ebene erstellt, um das Gehalt mit dem Standardwert 5000 zu fรผllen. Dadurch wird das Gehalt auf den Standardwert โ5000โ geรคndert, bevor der Datensatz in die Tabelle eingefรผgt wird.
- Code Zeile 11-14: Den Datensatz in die Tabelle โempโ einfรผgen.
- Code Linie 16: รberprรผfung des eingefรผgten Datensatzes.
Ausgang:
Trigger erstellt
PL/SQL-Prozedur erfolgreich abgeschlossen.
| EMP_NAME | EMP_NO | GEHALT | MANAGER | DEPT_NO |
|---|---|---|---|---|
| CCC | 1004 | 5000 | AAA | 30 |
Trigger aktivieren und deaktivieren
Trigger kรถnnen aktiviert oder deaktiviert werden. Um den Trigger zu aktivieren oder zu deaktivieren, muss eine ALTER-Anweisung (DDL) fรผr den Trigger angegeben werden, die ihn deaktiviert oder aktiviert.
Nachfolgend finden Sie die Syntax zum Aktivieren/Deaktivieren der Trigger.
ALTER TRIGGER <trigger_name> [ENABLE|DISABLE]; ALTER TABLE <table_name> [ENABLE|DISABLE] ALL TRIGGERS;
Syntaxerklรคrung:
- Die erste Syntax zeigt, wie der einzelne Trigger aktiviert/deaktiviert wird.
- Die zweite Anweisung zeigt, wie alle Trigger fรผr eine bestimmte Tabelle aktiviert/deaktiviert werden.
Zusammenfassung
In diesem Kapitel haben wir etwas รผber PL/SQL-Trigger und ihre Vorteile gelernt. Wir haben auch die verschiedenen Klassifizierungen kennengelernt und INSTEAD OF-Trigger und COMPOUND-Trigger besprochen.









