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.

  • ๐Ÿ”” Triggerdefinition: Ein Trigger ist ein gespeichertes Programm. Oracle Die Engine wird automatisch bei einem bestimmten DML-, DDL- oder Datenbankereignis ausgelรถst.
  • ๐ŸŽฏ Triggertypen: Trigger werden nach Zeitpunkt (VORHER, NACHHER, STATT VON), Ebene (ANWEISUNG, ZEILE) und Ereignis (DML, DDL, DATENBANK) klassifiziert.
  • ๐Ÿ” :NEU und :ALT: Zeilenbasierte Trigger verwenden die Klauseln :NEW und :OLD, um Spaltenwerte vor und nach der DML-Anweisung zu lesen.
  • ๐ŸชŸ STATT Trigger: Ein INSTEAD OF-Trigger ermรถglicht es, eine ansonsten nicht aktualisierbare komplexe Ansicht durch Aktionen auf ihren Basistabellen zu modifizieren.
  • ๐Ÿงฉ Zusammengesetzter Auslรถser: Ein kombinierter Abzug vereint die Aktionen fรผr alle vier Zeitmesspunkte in einem einzigen Abzugskรถrper.
  • ๐Ÿค– KI-Unterstรผtzung: KI-Assistenten wie GitHub Copilot entwerfen VORHER-, NACHHER-, STATT-VOR- und Kombinationsauslรถser aus einem Kommentar.

Oracle PL/SQL-Trigger, einschlieรŸlich INSTEAD OF und zusammengesetzter Triggertypen

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.

Syntax zur Triggererstellung mit den Optionen BEFORE, AFTER und INSTEAD OF in Oracle PL / SQL

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.

Erstellen der Basistabellen em und dept in Oracle fรผr das INSTEAD OF-Triggerbeispiel

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.

Einfรผgen von Beispielzeilen fรผr Abteilungen und Mitarbeiter in Oracle PL / SQL

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.

Erstellen und Abfragen der komplexen Ansicht guru99_emp_view, die emp und dept verknรผpft.

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.

Aktualisierung zum Fehler bei der komplexen Ansicht mit ORA-01779 vor dem INSTEAD OF-Trigger

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.

Erstellen des guru99_view_modify_trg INSTEAD OF-Triggers in der komplexen Ansicht

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.

Die Ansicht wurde erfolgreich รผber den INSTEAD OF-Trigger aktualisiert und zeigt den Standort FRANKREICH an.

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.

Syntax fรผr zusammengesetzte Trigger mit BEFORE- und AFTER-Anweisungen sowie Abschnitten zur Zeilenzeitsteuerung.

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.

Ein zusammengesetzter Trigger fรผllt die Spalte โ€žGehaltโ€œ automatisch mit dem Standardwert 5000.

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.

Hรคufig gestellte Fragen

Der Fehler ORA-04091 (Mutating Table) tritt auf, wenn ein Zeilentrigger versucht, dieselbe Tabelle abzufragen oder zu รคndern, die ihn ausgelรถst hat. Vermeiden Sie diesen Fehler, indem Sie einen zusammengesetzten Trigger, einen Anweisungstrigger oder eine Paketsammlung verwenden, um die Zeilen zu speichern.

Ein Trigger wird automatisch ausgelรถst, wenn eine DML- oder DDL-Anweisung oder ein Datenbankereignis auftritt; er benรถtigt keine Parameter und gibt keinen Wert zurรผck. gespeicherte Prozedur Die Funktion wird nur ausgefรผhrt, wenn sie explizit aufgerufen wird, akzeptiert Parameter und kann Werte zurรผckgeben.

Verwenden Sie die Anweisung DROP TRIGGER trigger_name, um einen Trigger dauerhaft zu entfernen. Im Gegensatz zum Deaktivieren, wodurch der Trigger zwar erhalten bleibt, aber nicht mehr ausgelรถst wird, bewirkt das Entfernen eines Triggers mit der Anweisung DROP TRIGGER eine dauerhafte Lรถschung.ping Dadurch wird die Definition vollstรคndig gelรถscht, sodass Sie sie neu erstellen mรผssen, wenn die Logik erneut benรถtigt wird.

Fragen Sie die Datenwรถrterbuchansichten USER_TRIGGERS nach Ihren eigenen Triggern oder ALL_TRIGGERS nach allen Triggern ab, auf die Sie zugreifen kรถnnen. Sie zeigen den Triggernamen, den Typ, das auslรถsende Ereignis, das Basisobjekt und den Status an, was Ihnen bei der รœberprรผfung vorhandener Trigger hilft.

Nicht direkt, da der Auslรถser die gleiche Anweisung wie die auslรถsende Anweisung verwendet. TransaktionUm einen Commit unabhรคngig durchzufรผhren, deklarieren Sie den Auslรถser oder eine von ihm aufgerufene Prozedur mit PRAGMA AUTONOMOUS_TRANSACTION. Dadurch wird die Arbeit in einer separaten Transaktion ausgefรผhrt, die selbststรคndig einen Commit durchfรผhrt.

Vorher Oracle In Version 11g war die Reihenfolge gleichartiger Trigger nicht garantiert. Ab Version 11g ermรถglicht die FOLLOWS-Klausel in der CREATE TRIGGER-Anweisung die Festlegung, dass ein Trigger nach dem anderen ausgelรถst wird, wodurch eine deterministische Ausfรผhrungsreihenfolge erreicht wird.

Ja. GitHub-Copilot Entwรผrfe VORHER, NACHHER, STATT VON und zusammengesetzte Auslรถser, einschlieรŸlich :NEW- und :OLD-Referenzen, aus einem Kommentar. RevPrรผfen Sie vor dem Einsatz des generierten Triggers die Timing-, WHEN-Bedingungs- und Mutating-Table-Risiken.

KI-Assistenten scannen Trigger auf Risiken durch verรคnderliche Tabellen, fehlende :NEW- oder :OLD-Behandlung, rekursives Auslรถsen und komplexe Logik, die DML-Operationen verlangsamt. Diese maschinelle Lernprรผfung kennzeichnet anfรคllige Trigger und schlรคgt Anpassungen auf Anweisungsebene oder in komplexen Codekomplexen vor, bevor der Code produktiv eingesetzt wird.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: