Oracle PL / SQL Trigger Tutorial: Anstelle von Compound [Beispiel]

Was ist Trigger in PL/ SQL?

TRIGGER sind gespeicherte Programme, die von Oracle Engine automatisch ausgelöst werden, wenn DML-Anweisungen wie insert, update, delete in der Tabelle ausgeführt werden oder einige Ereignisse auftreten. Der Code, der im Falle eines Triggers ausgeführt werden soll, kann gemäß der Anforderung definiert werden. Sie können das Ereignis, bei dem der Trigger ausgelöst werden soll, und den Zeitpunkt der Ausführung auswählen. Der Zweck von Trigger besteht darin, die Integrität der Informationen in der Datenbank aufrechtzuerhalten.

In diesem Tutorial erfahren Sie-

  • Vorteile von Triggern
  • Arten von Triggern in Oracle
  • So erstellen Sie Trigger
  • :NEUE und :ALTE Klausel
  • ANSTELLE VON Trigger
  • Zusammengesetzter Trigger

Vorteile von Triggern

Im Folgenden finden Sie die Vorteile von Triggern.

  • Automatisches Generieren einiger abgeleiteter Spaltenwerte
  • Erzwingen der referenziellen Integrität
  • Ereignisprotokollierung und Speichern von Informationen zum Tabellenzugriff
  • Auditing
  • Synchrone Replikation von Tabellen
  • Auferlegen von Sicherheitsberechtigungen
  • Verhindern ungültiger Transaktionen

Arten von Triggern in Oracle

Trigger können anhand der folgenden Parameter klassifiziert werden.

  • Klassifizierung basierend auf dem Timing
    • VOR DEM Trigger: Es wird ausgelöst, bevor das angegebene Ereignis aufgetreten ist.
    • AFTER Trigger: Es wird ausgelöst, nachdem das angegebene Ereignis aufgetreten ist.
    • STATT Trigger: Ein spezieller Typ. Sie erfahren mehr über die weiteren Themen. (nur für DML )
  • Klassifizierung basierend auf der Ebene
    • ANWEISUNG level Trigger: Es wird einmal für die angegebene Ereignisanweisung ausgelöst.
    • Zeilenpegelauslöser: Er wird für jeden Datensatz ausgelöst, der vom angegebenen Ereignis betroffen ist. (nur für DML)
  • Klassifizierung basierend auf dem Ereignis
    • DML-Trigger: Wird ausgelöst, wenn das DML-Ereignis angegeben wird (EINFÜGEN/AKTUALISIEREN/LÖSCHEN)
    • DDL-Trigger: Es wird ausgelöst, wenn das DDL-Ereignis angegeben wird (CREATE/ALTER)
    • DATABASE Trigger: Es wird ausgelöst, wenn das Datenbankereignis angegeben wird (LOGON/LOGOFF/STARTUP/SHUTDOWN)

Jeder Trigger ist also die Kombination der obigen Parameter.

So erstellen Sie einen Trigger

Nachfolgend finden Sie die Syntax zum Erstellen eines Triggers.

Trigger in PL/SQL

CREATE TRIGGER <trigger_name> ON<name of underlying object> 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 gibt die Zeitpunkte der Ereignisse an.
  • EINFÜGEN/AKTUALISIEREN/ANMELDEN/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, für den das DML-Ereignis im Fall eines DML-Triggers auftreten kann.
  • Befehl „FÜR JEDE Zeile“ wird die Zeile Level-Trigger angeben.
  • WHEN-Klausel gibt die zusätzliche Bedingung an, in der der Trigger ausgelöst werden muss.
  • Der Deklarationsteil, Ausführungsteil, Ausnahmebehandlungsteil ist derselbe wie der der anderen PL / SQL-Blöcke. Deklarationsteil und Ausnahmebehandlungsteil sind optional.

:NEW und :OLD Klausel

In 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 zwei Klauseln im Trigger auf Datensatzebene bereitgestellt, um diese Werte zu speichern. Wir können diese Klauseln verwenden, um auf die alten und neuen Werte im Triggerkörper zu verweisen.

  • :NEW – Enthält einen neuen Wert für die Spalten der Basistabelle/–ansicht während der Triggerausführung
  • :OLD – Enthält den alten Wert für die Spalten der Basistabelle/-ansicht während der Triggerausführung

Diese Klausel sollte basierend auf dem DML-Ereignis verwendet werden. In der folgenden Tabelle wird angegeben, welche Klausel für welche DML-Anweisung gültig ist (INSERT / UPDATE / DELETE).

EINFÜGEN AKTUALISIEREN LÖSCHEN
:NEU GÜLTIG GÜLTIG UNGÜLTIG. In diesem Fall gibt es keinen neuen Wert.
:ALT UNGÜLTIG. In diesem Fall gibt es keinen alten Wert GÜLTIG GÜLTIG

STATT Trigger

„STATT Trigger“ ist der spezielle Triggertyp. Es wird nur in DML-Triggern verwendet. Es wird verwendet, wenn ein DML-Ereignis in der komplexen Ansicht auftritt.

Betrachten Sie ein Beispiel, in dem eine Ansicht aus 3 Basistabellen erstellt wird. Wenn ein DML-Ereignis über diese Ansicht ausgegeben wird, wird dies ungültig, da die Daten aus 3 verschiedenen Tabellen stammen. Also wird in diesem ANSTELLE VON Trigger verwendet. Der INSTEAD OF-Trigger wird verwendet, um die Basistabellen direkt zu ändern, anstatt die Ansicht für das angegebene Ereignis zu ändern.

Beispiel 1: In diesem Beispiel erstellen wir eine komplexe Ansicht aus zwei Basistabellen.

  • Table_1 ist die EMP-Tabelle und
  • Table_2 ist die Abteilungstabelle.

Dann werden wir sehen, wie der INSTEAD OF-Trigger verwendet wird, um die location Detail-Anweisung für diese komplexe Ansicht zu aktualisieren. Wir werden auch sehen, wie :NEW und :OLD in Triggern nützlich sind.

  • Schritt 1: Erstellen der Tabelle ‚emp‘ und ‚dept‘ mit entsprechenden Spalten
  • Schritt 2: Auffüllen der Tabelle mit Beispielwerten
  • Schritt 3: Erstellen der Ansicht für die oben erstellte Tabelle
  • Schritt 4: Aktualisieren der Ansicht vor dem instead-of-Trigger
  • Schritt 5: Erstellen des Instead-of-Triggers
  • Schritt 6: Aktualisieren der Ansicht nach dem instead-of-Trigger

Schritt 1) Erstellen der Tabelle ‚emp ‚ mit entsprechenden Spalten

Trigger in PL/SQL

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));/

Erklärung des Codes

  • Codezeile 1-7: Tabelle ‚emp‘ Erstellung.
  • Codezeile 8-12: Erstellung der Tabelle ‚dept‘.

Ausgabe

Tabelle erstellt

Schritt 2) Nachdem wir die Tabelle erstellt haben, füllen wir diese Tabelle mit Beispielwerten und erstellen Ansichten für die obigen Tabellen.

Trigger in PL/ SQL

BEGININSERT INTO DEPT VALUES(10,‘HR’,‘USA’);INSERT INTO DEPT VALUES(20,'SALES','UK’);INSERT INTO DEPT VALUES(30,‘FINANCIAL',‘JAPAN'); COMMIT;END;/BEGININSERT 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;/

Erklärung des Codes

  • Codezeile 13-19: Einfügen von Daten in die Tabelle „dept“.
  • Codezeile 20-26: Einfügen von Daten in die Tabelle ‚emp‘.

Ausgabe

PL/SQL-Prozedur abgeschlossen

Schritt 3) Erstellen einer Ansicht für die oben erstellte Tabelle.

Trigger in PL/SQL

CREATE VIEW guru99_emp_view(Employee_name:dept_name,location) ASSELECT emp.emp_name,dept.dept_name,dept.locationFROM emp,deptWHERE emp.dept_no=dept.dept_no;/
SELECT * FROM guru99_emp_view;

Erklärung des Codes

  • Codezeile 27-32: guru99_emp_view‘ Ansicht.
  • Codezeile 33: guru99_emp_view abfragen.

Output

View created

EMPLOYEE_NAME DEPT_NAME LOCATION
ZZZ HR USA
YYY SALES UK
XXX FINANCIAL JAPAN

Step 4) Update of view before instead-of trigger.

Triggers in PL/SQL

BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name=:'XXX’;COMMIT;END;/

Code Explanation

  • Code line 34-38: Update the location of „XXX“ to ‚FRANCE‘. Die Ausnahme wurde ausgelöst, da die DML-Anweisungen in der komplexen Ansicht nicht zulässig sind.

Ausgabe

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 beim Aktualisieren der Ansicht im vorherigen Schritt zu vermeiden, verwenden wir in diesem Schritt „anstelle von“.“

Trigger in PL/SQL

CREATE TRIGGER guru99_view_modify_trgINSTEAD OF UPDATEON guru99_emp_viewFOR EACH ROWBEGINUPDATE deptSET location=:new.locationWHERE dept_name=:old.dept_name;END;/

Erklärung des Codes

  • Codezeile 39: Erstellung eines ANSTELLE EINES Triggers für das Ereignis ‚UPDATE‘ in der Ansicht ‚guru99_emp_view‘ auf Zeilenebene. Es enthält die update-Anweisung, um den Speicherort in der Basistabelle ‚dept‘ zu aktualisieren.
  • Codezeile 44: Update-Anweisung verwendet ‚:NEW‘ und ‚: OLD‘, um den Wert von Spalten vor und nach dem Update zu ermitteln.

Ausgabe

Trigger erstellt

Schritt 6) Aktualisieren der Ansicht nach Anstelle des Triggers. Jetzt wird der Fehler nicht auftreten, da „anstelle des Triggers“ den Aktualisierungsvorgang dieser komplexen Ansicht verarbeitet. Und wenn der Code ausgeführt wurde, wird der Standort des Mitarbeiters XXX von „Japan“ auf „Frankreich“ aktualisiert.“

Trigger in PL/SQL

BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX'; COMMIT;END;/
SELECT * FROM guru99_emp_view;

Erklärung des Codes:

  • Codezeile 49-53: Aktualisierung der Position von „XXX“ nach ‚FRANKREICH‘. Dies ist erfolgreich, da der Auslöser ‚INSTEAD OF‘ die eigentliche Update-Anweisung in der Ansicht gestoppt und die Aktualisierung der Basistabelle durchgeführt hat.
  • Codezeile 55: Überprüfung des aktualisierten Datensatzes.

Ausgabe: PL/SQL-Prozedur erfolgreich abgeschlossen

EMPLOYEE_NAME DEPT_NAME STANDORT
ZZZ HR USA
YYY VERTRIEB UK
XXX FINANZEN FRANKREICH

Zusammengesetzter Trigger

Der zusammengesetzte Trigger ist ein Trigger, mit dem Sie Aktionen für jeden der vier Zeitpunkte im einzelnen Triggerkörper angeben können. Die vier verschiedenen timing punkt es unterstützt ist als unten.

  • VOR DER Anweisungsebene
  • VOR DER Zeilenebene
  • NACH DER Zeilenebene
  • NACH DER Anweisungsebene

Es bietet die Möglichkeit, die Aktionen für verschiedene Zeitpunkte in demselben Trigger zu kombinieren.

Trigger in PL/SQL

CREATE TRIGGER <trigger_name> FORON <name of underlying object><Declarative part>‭ ‬BEFORE STATEMENT ISBEGIN<Execution part>;END BEFORE STATEMENT;BEFORE EACH ROW ISBEGIN<Execution part>;END EACH ROW;AFTER EACH ROW ISBEGIN<Execution part>;END AFTER EACH ROW;AFTER STATEMENT ISBEGIN<Execution part>;END AFTER STATEMENT;END;

Syntax-Erklärung:

  • Die obige Syntax zeigt die Erstellung von ‚ZUSAMMENGESETZTEN‘ Triggern.
  • Deklarative Abschnitt ist für alle Ausführungsblock im Triggerkörper gemeinsam.
  • Diese 4 Zeitblöcke können in beliebiger Reihenfolge sein. Es ist nicht zwingend erforderlich, alle diese 4 Zeitblöcke zu haben. Wir können einen ZUSAMMENGESETZTEN Trigger nur für die erforderlichen Timings erstellen.

Beispiel 1: In diesem Beispiel erstellen wir einen Trigger, um die Gehaltsspalte automatisch mit dem Standardwert 5000 zu füllen.

Trigger in PL/SQL

CREATE TRIGGER emp_trig FOR INSERT ON empCOMPOUND TRIGGER BEFORE EACH ROW IS BEGIN:new.salary:=5000;END BEFORE EACH ROW;END emp_trig;/
BEGININSERT INTO EMP VALUES(1004,‘CCC’,15000,‘AAA’,30); COMMIT;END;/
SELECT * FROM emp WHERE emp_no=1004;

Erklärung des Codes:

  • Codezeile 2-10: Erstellung eines zusammengesetzten Triggers. Es wird für das Timing VOR der Zeilenebene 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.
  • Codezeile 11-14: Fügen Sie den Datensatz in die Tabelle ‚emp‘ ein.
  • Codezeile 16: Überprüfen des eingefügten Datensatzes.

Ausgabe:

Trigger erstellt

PL/SQL-Prozedur erfolgreich abgeschlossen.

EMP_NAME EMP_NO GEHALT MANAGER ABTEILUNGSNUMMER
CCC 1004 5000 AAA 30

Aktivieren und Deaktivieren von Triggern

Trigger können aktiviert oder deaktiviert werden. Um den Trigger zu aktivieren oder zu deaktivieren, muss für den Trigger, der ihn deaktiviert oder aktiviert, eine ALTER-Anweisung (DDL) angegeben werden.

Nachfolgend finden Sie die Syntax zum Aktivieren /Deaktivieren der Trigger.

ALTER TRIGGER <trigger_name> ;ALTER TABLE <table_name> ALL TRIGGERS;

Syntax-Erklä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 PL/SQL-Trigger und ihre Vorteile kennengelernt. Wir haben auch die verschiedenen Klassifikationen gelernt und ANSTELLE VON Trigger und COMPOUND Trigger diskutiert.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.