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.

erstellen Auslรถser

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

STATT Auslรถser

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.

STATT Auslรถser

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.

STATT Auslรถser

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.

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โ€œ.

STATT Auslรถser

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.

STATT Auslรถser

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.

Zusammengesetzter Trigger

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.

Zusammengesetzter Trigger

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.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: