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: