Oracle PL/SQL-Trigger: Anstelle von & zusammengesetzten Typen
โก Intelligente Zusammenfassung
PL/SQL-Trigger sind gespeicherte Programme, die Oracle Die Engine wird automatisch ausgelรถst, wenn eine DML-, DDL- oder Datenbankoperation stattfindet. Sie gewรคhrleistet die Datenintegritรคt, setzt Regeln durch und unterstรผtzt die รberwachung. Zu ihr gehรถren die Datentypen BEFORE, AFTER, INSTEAD OF und zusammengesetzte Datentypen.

Was ist Trigger in PL/SQL?
Trigger werden gespeichert PL / SQL Programme, die von der Oracle Motor automatisch wenn DML-Anweisungen Trigger werden, wie beispielsweise Einfรผge-, Aktualisierungs- und Lรถschvorgรคnge, auf einer Tabelle ausgefรผhrt oder wenn bestimmte Ereignisse eintreten. Der im Falle eines Triggers auszufรผhrende Code kann bedarfsgerecht definiert werden. Sie kรถnnen das Ereignis, bei dem der Trigger ausgelรถst werden soll, und den Ausfรผhrungszeitpunkt festlegen. Der Zweck eines Triggers besteht darin, die Datenintegritรคt in der Datenbank zu gewรคhrleisten.
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 dem Zeitpunkt
- VOR dem Auslรถser: Es wird ausgelรถst, bevor das angegebene Ereignis eingetreten ist.
- NACH Auslรถser: Es wird ausgelรถst, nachdem das angegebene Ereignis eingetreten ist.
- STATT Trigger: Ein spezieller Typ. Mehr dazu erfahren Sie in den folgenden Abschnitten. (Nur fรผr DML)
Klassifizierung basierend auf dem Niveau
- Trigger auf Anweisungsebene: Es wird einmalig fรผr die angegebene Ereignisanweisung ausgelรถst.
- Auslรถser auf Zeilenebene: Es wird fรผr jeden Datensatz ausgelรถst, der von dem angegebenen Ereignis betroffen ist. (Nur fรผr DML)
Klassifizierung basierend auf dem Ereignis
- DML-Trigger: Es wird ausgelรถst, wenn das DML-Ereignis (INSERT/UPDATE/DELETE) angegeben wird.
- DDL-Trigger: Es wird ausgelรถst, wenn das DDL-Ereignis (CREATE/ALTER) angegeben wird.
- Datenbank-Trigger: Es wird ausgelรถst, wenn das Datenbankereignis angegeben wird (LOGON/LOGOFF/STARTUP/SHUTDOWN).
Jeder Trigger ist also eine Kombination der oben genannten Parameter.
So erstellen Sie einen Trigger
Nachfolgend finden Sie die Syntax zum Erstellen eines Triggers. Der Screenshot unten zeigt diese Trigger-Erstellungssyntax. Oracle.
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.
- VORHER/NACHHER legt die Zeitpunkte der Ereignisse fest.
- EINFรGEN/AKTUALISIEREN/ANMELDUNG/ERSTELLEN/etc. gibt das Ereignis an, fรผr das der Trigger ausgelรถst werden muss.
- Die ON-Klausel legt das Objekt fest, fรผr das das oben genannte Ereignis gilt. Dies ist beispielsweise der Tabellenname, fรผr den das DML-Ereignis im Falle eines DML-Triggers auftreten kann.
- Der Befehl โFOR EACH ROWโ legt den Trigger auf Zeilenebene fest.
- Die WHEN-Klausel legt die zusรคtzliche Bedingung fest, unter der der Trigger ausgelรถst werden muss.
- Der Deklarationsteil, der Ausfรผhrungsteil und der Ausnahmebehandlungsteil sind die gleichen wie bei den anderen PL/SQL-BlรถckeDer Deklarationsteil und der Ausnahmebehandlung Teile davon 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 Der Zeilenebenentrigger enthรคlt zwei Klauseln, die diese Werte speichern. Mithilfe dieser Klauseln kรถnnen wir innerhalb des Trigger-Bodys auf die alten und neuen Werte zugreifen.
- :NEU โ Es enthรคlt wรคhrend der Triggerausfรผhrung einen neuen Wert fรผr die Spalten der Basistabelle/-ansicht.
- :ALT โ Es speichert den alten Wert der Spalten der Basistabelle/-ansicht wรคhrend der Triggerausfรผhrung.
Diese Klausel sollte abhรคngig vom DML-Ereignis verwendet werden. Die folgende Tabelle gibt an, welche Klausel fรผr welche DML-Anweisung (INSERT/UPDATE/DELETE) gรผltig ist.
| INSERT | AKTUALISIEREN | LรSCHEN | |
|---|---|---|---|
| :NEU | GรLTIG | GรLTIG | UNGรLTIG. Im Lรถschfall wurde kein neuer Wert hinzugefรผgt. |
| :ALT | UNGรLTIG. Im Einfรผgefall ist kein alter Wert vorhanden. | GรLTIG | GรLTIG |
STATT Auslรถser
Ein โINSTEAD OFโ-Trigger ist ein spezieller Triggertyp. Er wird ausschlieรlich in DML-Triggern verwendet. Er kommt zum Einsatz, wenn ein DML-Ereignis in einer komplexen Ansicht ausgelรถst werden soll.
Betrachten wir ein Beispiel, in dem eine Ansicht aus drei Basistabellen erstellt wird. Jede DML-Operation, die auf dieser Ansicht ausgefรผhrt wird, ist ungรผltig, da die Daten aus drei verschiedenen Tabellen stammen. In diesem Fall wird ein INSTEAD OF-Trigger verwendet. Dieser Trigger รคndert die Basistabellen direkt, anstatt die Ansicht fรผr das jeweilige Ereignis zu modifizieren.
Beispiel 1: In diesem Beispiel erstellen wir eine komplexe Ansicht aus zwei Basistabellen, wobei Tabelle_1 die Mitarbeitertabelle und Tabelle_2 die Abteilungstabelle ist.
Anschlieรend sehen wir uns an, wie der INSTEAD OF-Trigger verwendet wird, um die Standortdetails in dieser komplexen Ansicht zu aktualisieren. Wir werden auch sehen, wie :NEW und :OLD in Triggern nรผtzlich sind. Das Beispiel wird in den folgenden Schritten durchgefรผhrt:
- Schritt 1: Erstellen der Tabellen 'emp' und 'dept' mit den entsprechenden Spalten
- Schritt 2: Die Tabellen mit Beispielwerten fรผllen
- Schritt 3: Erstellen einer Ansicht fรผr die oben erstellten Tabellen
- Schritt 4: Aktualisierung der Ansicht vor dem INSTEAD OF-Trigger
- Schritt 5: Erstellung des INSTEAD OF-Triggers
- Schritt 6: Aktualisierung der Ansicht nach dem INSTEAD OF-Trigger
Schritt 1) โโErstellen der Tabellen 'emp' und 'dept' mit den entsprechenden Spalten.
Der folgende Screenshot zeigt die Erstellung der Basistabellen โempโ und โdeptโ in Oracle.
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:
Table Created
Schritt 2) Nachdem wir nun die Tabellen erstellt haben, werden wir sie mit Beispielwerten fรผllen.
Der untenstehende Screenshot zeigt, wie die Beispielzeilen in die Tabellen 'dept' und 'emp' eingefรผgt werden.
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,'XXX',15000,'AAA',30); INSERT INTO EMP VALUES(1001,'YYY',18000,'AAA',20) ; INSERT INTO EMP VALUES(1002,'ZZZ',20000,'AAA',10); COMMIT; END; /
Code Erlรคuterung
- Code Zeile 13-19: Einfรผgen von Daten in die Tabelle โdeptโ.
- Code Zeile 20-26: Einfรผgen von Daten in die Tabelle 'emp'.
Ausgang:
PL/SQL procedure completed
Schritt 3) Es wird eine Ansicht fรผr die oben erstellten Tabellen erstellt.
Der folgende Screenshot zeigt, wie die komplexe Ansicht erstellt und anschlieรend abgefragt wird.
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:
View created
| MITARBEITERNAME | DEPT_NAME | STANDORT |
|---|---|---|
| ZZZ | HR | USA |
| Yyy | Angebote | UK |
| XXX | FINANCIAL | JAPAN |
Schritt 4) Aktualisierung der Ansicht vor dem INSTEAD OF-Trigger.
Der untenstehende Screenshot zeigt den Aktualisierungsversuch der komplexen Ansicht und den daraus resultierenden Fehler.
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โ. Es wurde eine Ausnahme ausgelรถst, da DML-Anweisungen nicht direkt auf der komplexen Sicht zulรคssig sind.
Ausgang:
ORA-01779: cannot modify a column which maps to a non key-preserved table ORA-06512: at line 2
Schritt 5) Um den Fehler zu vermeiden, der beim Aktualisieren der Ansicht im vorherigen Schritt aufgetreten ist, verwenden wir in diesem Schritt einen โINSTEAD OFโ-Trigger.
Der folgende Screenshot zeigt die Erstellung des INSTEAD OF-Triggers.
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 des INSTEAD OF-Triggers fรผr das Ereignis โUPDATEโ in der Ansicht โguru99_emp_viewโ auf Zeilenebene. Er enthรคlt die Aktualisierungsanweisung zum Aktualisieren des Standorts in der Basistabelle โdeptโ.
- Code Zeile 44: Die Aktualisierungsanweisung verwendet ':NEW' und ':OLD', um den Wert der Spalten vor und nach der Aktualisierung zu ermitteln.
Ausgang:
Trigger Created
Schritt 6) Die Ansicht wird nach dem INSTEAD OF-Trigger aktualisiert. Der Fehler tritt nun nicht mehr auf, da der INSTEAD OF-Trigger die Aktualisierung dieser komplexen Ansicht รผbernimmt. Bei der Codeausfรผhrung wird der Standort von Mitarbeiter XXX von โJapanโ auf โFrankreichโ aktualisiert.
Der untenstehende Screenshot zeigt das erfolgreiche Update รผber den INSTEAD OF-Trigger und die aktualisierte Ansicht.
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: Die Position von โXXXโ wurde auf โFRANKREICHโ aktualisiert. Dies war erfolgreich, da der Trigger โINSTEAD OFโ die eigentliche Aktualisierungsanweisung fรผr die Ansicht gestoppt und stattdessen die Aktualisierung der Basistabelle durchgefรผhrt hat.
- Code Zeile 55: รberprรผfen des aktualisierten Datensatzes.
Ausgang:
PL/SQL procedure successfully completed
| MITARBEITERNAME | DEPT_NAME | STANDORT |
|---|---|---|
| ZZZ | HR | USA |
| Yyy | Angebote | UK |
| XXX | FINANCIAL | FRANKREICH |
Zusammengesetzter Trigger
Der zusammengesetzte Trigger ermรถglicht es Ihnen, Aktionen fรผr jeden der vier Zeitpunkte in einem einzigen Trigger-Body festzulegen. Die vier unterstรผtzten Zeitpunkte sind unten aufgefรผhrt.
- VORHERIGE ERKLรRUNG โ Ebene
- VOR DER REIHE โ Ebene
- NACH REIHE โ Ebene
- NACH ERKLรRUNG โ Ebene
Es bietet die Mรถglichkeit, Aktionen fรผr unterschiedliche Zeitpunkte in einem einzigen Auslรถser zu kombinieren.
Der folgende Screenshot zeigt die Syntax des zusammengesetzten Triggers mit seinen vier Zeitabschnitten.
CREATE [ OR REPLACE ] TRIGGER <trigger_name> FOR [INSERT | UPDATE | DELETE.......] 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 eines 'COMPOUND'-Triggers.
- Der Deklarationsteil ist fรผr alle Ausfรผhrungsblรถcke im Trigger-Rumpf gemeinsam.
- Diese vier Timing-Blรถcke kรถnnen in beliebiger Reihenfolge angeordnet sein. Es ist nicht zwingend erforderlich, alle vier Timing-Blรถcke zu verwenden. Wir kรถnnen einen zusammengesetzten Trigger nur fรผr die benรถtigten Timings erstellen.
Beispiel 1: In diesem Beispiel erstellen wir einen Trigger, der die Spalte โGehaltโ automatisch mit dem Standardwert 5000 befรผllt.
Der folgende Screenshot zeigt das Beispiel des zusammengesetzten Triggers und dessen Ausgabe.
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 des zusammengesetzten Triggers. Dieser Trigger wird auf der Ebene โVor Zeileโ ausgefรผhrt, um das Gehalt mit dem Standardwert 5000 zu befรผllen. Dadurch wird das Gehalt vor dem Einfรผgen des Datensatzes in die Tabelle auf den Standardwert โ5000โ geรคndert.
- Code Zeile 11-14: Fรผge den Datensatz in die Tabelle 'emp' ein.
- Code Zeile 16: รberprรผfung des eingefรผgten Datensatzes.
Ausgang:
Trigger created PL/SQL procedure successfully completed.
| 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 einen Trigger zu aktivieren oder zu deaktivieren, muss eine ALTER-Anweisung (DDL) fรผr den entsprechenden Trigger angegeben werden.
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 ein einzelner Trigger aktiviert/deaktiviert wird.
- Die zweite Anweisung zeigt, wie alle Trigger fรผr eine bestimmte Tabelle aktiviert/deaktiviert werden.









