mi a Trigger a PL/SQL-ben?
A triggerek olyan tárolt programok, amelyeket az Oracle engine automatikusan kiéget, amikor a DML-nyilatkozatok, például a Beszúrás, a frissítés, a Törlés végrehajtásra kerülnek az asztalon, vagy bizonyos események fordulnak elő. A trigger esetén kivágandó kód a követelmény szerint definiálható. Kiválaszthatja azt az eseményt, amelyen a ravaszt ki kell lőni, valamint a végrehajtás időzítését. A trigger célja az adatbázisban található információk integritásának fenntartása.
ebben A tutorial, hogy megtanulják, –
- Előnyei Kiváltó
- Típusú Kiváltó Oracle
- Hogyan hozható Létre a Trigger
- :ÚJ :RÉGI Záradék
- HELYETT Ravaszt
- Összetett Ravaszt
Előnyei Kiváltó
a Következő előnyei vannak a kiváltó okot.
- Generál egy származtatott oszlop értékeit automatikusan
- Érvényesítése referenciális integritás
- Esemény naplózását, illetve tárolja az adatokat a táblázat hozzáférés
- Naplózás
- Szinkron replikáció a táblázatok
- Impozáns biztonsági engedélyek
- Megakadályozza érvénytelen ügyletek
Típusú Kiváltó Oracle
Kiváltó sorolható alapján a következő paramétereket.
- osztályozás az időzítés alapján
- A Trigger előtt: a megadott esemény bekövetkezése előtt tüzel.
- Trigger után: a megadott esemény bekövetkezése után tüzel.
- Trigger helyett: egy speciális Típus. Többet megtudhat a további témákról. (csak DML esetén)
- osztályozás a
- UTASÍTÁSSZINT Trigger szint alapján: a megadott eseménykimutatáshoz egyszer tüzel.
- ROW level Trigger: minden olyan rekordra tüzel, amelyet a megadott esemény érintett. (csak DML esetén)
- osztályozás az esemény alapján
- DML Trigger: a DML esemény megadásakor (beszúrás/frissítés/törlés)
- DDL Trigger: Ha a DDL esemény meg van adva (CREATE/ALTER)
- adatbázis Trigger: az adatbázis esemény megadásakor tüzel (LOGON/LOGOFF/indítás/leállítás)
tehát minden trigger a fenti paraméterek kombinációja.
Hogyan hozzunk létre triggert
Az alábbiakban a trigger létrehozásának szintaxisa található.
CREATE TRIGGER <trigger_name> ON<name of underlying object> DECLARE<Declaration part>BEGIN<Execution part> EXCEPTION<Exception handling part> END;
szintaxis magyarázat:
- a fenti szintaxis a trigger létrehozásában jelen lévő különböző opcionális kijelentéseket mutatja.
- előtt / után adja meg az esemény időzítését.
- INSERT/UPDATE/LOGON/CREATE / etc. meghatározza azt az eseményt, amelyre a ravaszt ki kell lőni.a
- on záradék meghatározza, hogy a fent említett esemény melyik objektumra érvényes. Például ez lesz a táblázat neve, amelyen a DML esemény előfordulhat a DML Trigger esetében.
- parancs “minden sorhoz” megadja a SORSZINT ravaszt.
- mikor záradék meghatározza a további feltétel, amelyben a ravaszt kell tüzet.
- a Deklarációs rész, végrehajtási rész, kivételkezelő rész megegyezik a többi PL/SQL blokkéval. A nyilatkozat része és a kivételkezelés része nem kötelező.
:új és :régi záradék
egy sor szintű triggerben a trigger minden kapcsolódó sorhoz tüzet okoz. Néha meg kell ismerni az értéket a DML nyilatkozat előtt és után.
Az Oracle két záradékot biztosított a rekordszintű triggerben ezen értékek megtartásához. Ezeket a záradékokat használhatjuk a régi és új értékekre a trigger testben.
- :Új-új értéket tart az alaptábla/nézet oszlopaihoz a trigger végrehajtása során
- :régi-az alaptábla/nézet oszlopainak régi értékét tartja a trigger végrehajtása során
ezt a záradékot a DML esemény alapján kell használni. Az alábbi táblázat meghatározza, hogy melyik záradék érvényes a DML-nyilatkozatra (beszúrás/frissítés/törlés).
INSERT | UPDATE | DELETE | ||
: NEW | VALID | érvényes | érvénytelen. A törlési esetben nincs új érték. | |
:Régi | érvénytelen. A | VALID | VALID |
helyett Trigger
“helyett trigger” a trigger speciális típusa. Csak a DML triggerekben használják. Ezt akkor használják, ha bármilyen DML esemény fog bekövetkezni a komplex nézet.
Vegyünk egy példát, amelyben egy nézet 3 alaptáblából készül. Ha bármilyen DML esemény kerül kiadásra ezen a nézeten, ez érvénytelenné válik, mert az adatok 3 különböző táblázatból származnak. Tehát ebben a trigger helyett használják. A trigger helyett az alaptáblázatokat közvetlenül módosítjuk az adott esemény nézetének módosítása helyett.
1. példa: ebben a példában komplex nézetet fogunk létrehozni két alaptáblából.
- Table_1 is emp table and
- Table_2 is department table table_2.
akkor látni fogjuk, hogy a trigger helyett hogyan használják a helymeghatározási nyilatkozat frissítését ebben a komplex nézetben. Azt is látni fogjuk, hogy a: NEW and: OLD hasznos a triggerekben.
- 1. lépés: Tábla létrehozása ’emp’, illetve ‘osztály’ a megfelelő oszlop
- 2. Lépés: Kitöltése a táblázatot a minta értékek
- 3. Lépés: Creating a nézet, hogy a fent létrehozott táblázat
- 4. Lépés: Frissítse a nézetet, mielőtt a helyett-a ravaszt
- 5. Lépés: Teremtés a helyett-a ravaszt
- 6. Lépés: Frissítés nézet után, hanem-a ravaszt
1. Lépés) Tábla létrehozása ’emp’, illetve ‘osztály’ a megfelelő oszlop
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));/
Kód Magyarázat
- Kód vonal 1-7: Táblázat ” emp ” létrehozása.
- kódsor 8-12: táblázat’ dept ‘ létrehozása.
Output
Table Created
2. lépés) Most, hogy létrehoztuk a táblázatot, feltöltjük ezt a táblázatot mintaértékekkel és a fenti táblázatok nézeteinek létrehozásával.
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;/
Kód magyarázata
- kódsor 13-19: adatok beillesztése a “dept” táblázatba.
- kódsor 20-26: adatok beillesztése az ” emp ” táblába.
kimenet
PL / SQL eljárás befejeződött
3. lépés) nézet létrehozása a fent létrehozott táblához.
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;
Kód magyarázata
- kódsor 27-32: létrehozása “guru99_emp_view” nézet.
- 33-as kódsor: guru99_emp_view lekérdezése.
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.
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’. Ez azért emelte ki a kivételt, mert a DML-kimutatások nem engedélyezettek a komplex nézetben.
Output
ORA-01779: nem lehet módosítani egy oszlopot, amely egy nem Kulcs-megőrzött táblára térképez
ORA-06512: a 2.sorban
5. lépés), hogy elkerüljük a hiba találkozását az előző lépés frissítési nézetében, ebben a lépésben a “trigger helyett.”
CREATE TRIGGER guru99_view_modify_trgINSTEAD OF UPDATEON guru99_emp_viewFOR EACH ROWBEGINUPDATE deptSET location=:new.locationWHERE dept_name=:old.dept_name;END;/
Kód magyarázata
- kódsor 39: Létrehozása helyett trigger “frissítés” esemény a “guru99_emp_view” nézetben a sor szintjén. Tartalmazza a frissítési nyilatkozatot, hogy frissítse a helyet a “dept” alaptáblában.
- 44-es kódsor: a frissítési utasítás a frissítés előtt és után az oszlopok értékének megtalálásához a”: NEW “és a”: OLD ” szavakat használja.
kimenet
Trigger létrehozva
6. lépés) a nézet frissítése a trigger helyett. Most a hiba nem fog megjelenni, mivel a” trigger helyett ” kezeli ennek a komplex nézetnek a frissítési működését. Amikor a kódex végrehajtja a XXX alkalmazott helyét, frissítésre kerül” Franciaország ” – ra Japánból.”
BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX'; COMMIT;END;/
SELECT * FROM guru99_emp_view;
Kód magyarázata:
- kódsor 49-53: a “XXX” helyének frissítése “Franciaország” – ra. Ez azért sikeres, mert a “helyett” trigger leállította a tényleges frissítési nyilatkozatot a nézetben, majd végrehajtotta az alaptábla frissítését.
- 55-ös kódsor: a frissített rekord ellenőrzése.
kimenet:
a PL/SQL eljárás sikeresen befejeződött
EMPLOYEE_NAME | DEPT_NAME | HELYSZÍN |
ZZZ | HR | MAGYARORSZÁG |
YYY | ÉRTÉKESÍTÉSI | egyesült KIRÁLYSÁG |
XXX | PÉNZÜGYI | FRANCIAORSZÁG |
Összetett Ravaszt
A Vegyület okozza a ravaszt, amely lehetővé teszi, hogy meghatározza, intézkedések az egyes, a négy időzítés pont a single trigger test. A négy különböző időzítési pont támogatja az alábbi.
- előtt nyilatkozat – level
- előtt sor-level
- után sor-level
- után nyilatkozat-level
Ez biztosítja a lehetőséget, hogy összekapcsolják a műveletek különböző időzítés ugyanabba a ravaszt.
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;
szintaxis magyarázat:
- a fenti szintaxis a “vegyület” trigger létrehozását mutatja.
- a deklaratív szakasz a trigger test összes végrehajtási blokkjára jellemző.
- ezek a 4 időzítési blokk bármilyen sorrendben lehet. Ez nem kötelező, hogy az összes ilyen 4 időzítés blokkok. Létrehozhatunk egy összetett triggert csak a szükséges időzítésekhez.
1. példa: ebben a példában létrehozunk egy ravaszt, hogy automatikusan feltöltsük a Fizetési oszlopot az alapértelmezett 5000 értékkel.
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;
kód magyarázat:
- kódsor 2-10: összetett Trigger létrehozása. A Soros szint előtti időzítéshez jön létre, hogy a fizetést 5000 alapértelmezett értékkel töltse fel. Ez megváltoztatja a fizetést az “5000” alapértelmezett értékre, mielőtt a rekordot beillesztené a táblázatba.
- kódsor 11-14: helyezze be a rekordot az ” emp ” táblába.
- kódsor 16: a beillesztett rekord ellenőrzése.
kimenet:
Trigger létrehozott
PL / SQL eljárás sikeresen befejeződött.
EMP_NAME | EMP_NO | fizetés | menedzser | DEPT_NO | |
CCC | 1004 | 5000 | AAA | 30 |
A triggerek engedélyezése és letiltása
a triggerek engedélyezhetők vagy letilthatók. A trigger engedélyezéséhez vagy letiltásához meg kell adni egy ALTER (DDL) nyilatkozatot a trigger számára, amely letiltja vagy engedélyezi.
Az alábbiakban a triggerek engedélyezésének/letiltásának szintaxisa található.
ALTER TRIGGER <trigger_name> ;ALTER TABLE <table_name> ALL TRIGGERS;
szintaxis magyarázat:
- az első szintaxis megmutatja, hogyan lehet engedélyezni/letiltani az egyetlen triggert.
- a második utasítás bemutatja, hogyan lehet engedélyezni/letiltani az összes triggert egy adott asztalon.
összefoglaló
ebben a fejezetben megismertük a PL / SQL triggereket és azok előnyeit. Megtanultuk a különböző osztályozásokat is, és a trigger és az összetett trigger helyett tárgyaltunk.