Mis on päästik PL / SQL-is?
TRIGGERS on salvestatud programmid, mille Oracle'i mootor käivitab automaatselt, kui tabelis käivitatakse DML-i avaldused, nagu sisestamine, värskendamine, kustutamine, või toimuvad mõned sündmused. Päästiku korral käivitatava koodi saab määratleda vastavalt nõudele. Saate valida sündmuse, millele päästik tuleb käivitada, ja täitmise ajastuse. Päästiku eesmärk on säilitada andmebaasis oleva teabe terviklikkus.
Selles õpetuses saate teada
- Käivitajate eelised
- Oracle'i käivitajate tüübid
- Kuidas käivitada
- : UUS ja: VANA klausel
- Käivitaja asemel
- Ühendi päästik
Käivitajate eelised
Järgmised on päästikute eelised.
- Mõne tuletatud veeru väärtuse loomine automaatselt
- Referentsiaalse terviklikkuse tagamine
- Sündmuste logimine ja tabelisse juurdepääsu teabe salvestamine
- Auditeerimine
- Tabelite sünkroonne replikatsioon
- Turvalubade kehtestamine
- Kehtetute tehingute ennetamine
Oracle'i käivitajate tüübid
Käivitajaid saab klassifitseerida järgmiste parameetrite alusel.
- Klassifikatsioon ajastuse põhjal
- ENNE käivitamist: see käivitub enne määratud sündmuse toimumist.
- PÄRAST päästik: see käivitub pärast määratud sündmuse toimumist.
- Käiviti asemel: eritüüp. Lisateavet saate edasiste teemade kohta. (ainult DML)
- Klassifikatsioon taseme põhjal
- STATEMENT-taseme päästik: see käivitatakse määratud sündmuse avalduse jaoks üks kord.
- ROW-taseme päästik: see käivitatakse iga kirje puhul, mida määratud sündmus mõjutas. (ainult DML)
- Klassifikatsioon sündmuse põhjal
- DML-päästik: see käivitub, kui DML-sündmus on määratud (INSERT / UPDATE / DELETE)
- DDL-i päästik: see käivitub, kui DDL-sündmus on määratud (CREATE / ALTER)
- ANDMEBAASI päästik: see käivitub, kui andmebaasi sündmus on määratud (LOGON / LOGOFF / STARTUP / SHUTDOWN)
Nii et iga päästik on ülaltoodud parameetrite kombinatsioon.
Kuidas käivitada
Allpool on päästiku loomise süntaks.
CREATE [ OR REPLACE ] TRIGGER[BEFORE | AFTER | INSTEAD OF ][INSERT | UPDATE | DELETE… ]ON [FOR EACH ROW][WHEN ]DECLARE BEGIN EXCEPTION END;
Süntaksi selgitus:
- Ülaltoodud süntaks näitab erinevaid valikulisi käske, mis on päästiku loomisel.
- BEFORE / AFTER määrab sündmuse ajastuse.
- INSERT / UPDATE / LOGON / CREATE / jne. määrab sündmuse, mille päästik tuleb käivitada.
- Klausel ON määrab, millisel objektil ülalnimetatud sündmus kehtib. Näiteks on see tabeli nimi, millel DML-i sündmus võib toimuda DML-käivitaja korral.
- Käsk "IGA RIDA" määrab ROW-taseme päästiku.
- WHEN-klausel täpsustab lisatingimuse, milles päästik peab käivituma.
- Deklaratsiooni osa, täitmisosa, erandi käitlemise osa on sama mis teiste PL / SQL plokkide puhul. Deklaratsiooni osa ja erandite käsitlemise osa on valikulised.
: UUS ja: VANA klausel
Rea taseme päästikus käivitatakse päästik iga seotud rea kohta. Mõnikord on vaja teada väärtust enne ja pärast DML-i avaldust.
Oracle on nende väärtuste hoidmiseks andnud RECORD-taseme päästikule kaks klauslit. Nende lausete abil saame viidata päästiku keha vanadele ja uutele väärtustele.
- : UUS - see hoiab päästiku käivitamisel uut väärtust põhitabeli / vaate veergude jaoks
- : VANA - see hoiab päästiku käivitamise ajal põhitabeli / vaate veergude vana väärtust
Seda klauslit tuleks kasutada DML-i sündmuse põhjal. Allpool olevas tabelis täpsustatakse, milline klausel millise DML-i lause jaoks kehtib (INSERT / UPDATE / DELETE).
SISSE | UUENDAMINE | KUSTUTA | |
: UUS | KEHTIV | KEHTIV | KEHTETU. Kustutamise puhul pole uut väärtust. |
: VANA | KEHTETU. Sisestähtedes pole vana väärtust | KEHTIV | KEHTIV |
Käivitaja asemel
"Päästiku asemel" on päästiku eritüüp. Seda kasutatakse ainult DML-i käivitamisel. Seda kasutatakse juhul, kui kompleksvaates toimub mõni DML-i sündmus.
Mõelgem näitele, kus vaade tehakse kolmest põhitabelist. Kui selle vaate kaudu väljastatakse mõni DML-sündmus, muutub see kehtetuks, kuna andmed on võetud kolmest erinevast tabelist. Nii et selles kasutatakse päästikut INSTEAD. Käivitist INSTEAD OF kasutatakse baasitabelite vahetuks muutmiseks selle asemel, et modifitseerida antud sündmuse vaadet.
Näide 1 : Selles näites loome kahest põhitabelist keeruka vaate.
- Tabel_1 on emp tabel ja
- Tabel_2 on osakonna tabel.
Siis vaatame, kuidas päästikut INSTEAD OF kasutatakse selle detailvaate värskendamiseks asukoha üksikasjade avalduses. Samuti vaatame, kuidas: NEW ja: OLD on päästikute jaoks kasulikud.
- 1. samm: tabelite 'emp' ja 'dept' loomine vastavate veergudega
- 2. samm: tabeli täitmine näidisväärtustega
- 3. samm: ülaltoodud tabeli vaate loomine
- 4. samm: vaate värskendamine enne päästiku käivitamist
- 5. samm: päästiku asemel selle loomine
- 6. toiming: vaate värskendamine päästiku asemel
1. samm. Tabelite 'emp' ja 'dept' loomine vastavate veergudega
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));/
Koodi selgitus
- Koodirida 1-7 : tabeli 'emp' loomine.
- Koodirida 8-12 : tabeli 'osakonna' loomine.
Väljund
Tabel on loodud
2. samm. Nüüd, kui oleme tabeli loonud, täidame selle tabeli ülaltoodud tabelite näidisväärtuste ja vaadete loomisega.
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;/
Koodi selgitus
- Koodirida 13-19 : andmete sisestamine tabelisse "osakond".
- Koodirida 20–26: andmete sisestamine tabelisse „emp”.
Väljund
PL / SQL-i protseduur on lõpule viidud
Samm 3) Ülaltoodud tabeli vaate loomine.
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;
Koodi selgitus
- Koodirida 27-32: vaate 'guru99_emp_view' loomine.
- Koodirida 33: päringu guru99_emp_view küsimine.
Väljund
Vaade on loodud
TÖÖTAJA | DEPT_NAME | ASUKOHT |
ZZZ | HR | USA |
AAAA | MÜÜK | Suurbritannia |
XXX | RAHALINE | Jaapan |
4. samm . Vaate värskendamine enne päästiku asemel.
BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name=:'XXX’;COMMIT;END;/
Koodi selgitus
- Koodirida 34-38: värskendage "XXX" asukoht "FRANCE". See tõi erandi, kuna DML-i avaldused pole kompleksvaates lubatud.
Väljund
ORA-01779: veergu, mis kaardistatakse võtmeta säilitamata tabeliks, ei saa muuta
ORA-06512: liinil 2
5. etapp . Vigade vältimiseks eelmises etapis vaate värskendamisel kasutame selles etapis käiviti asemel käsku ".
CREATE TRIGGER guru99_view_modify_trgINSTEAD OF UPDATEON guru99_emp_viewFOR EACH ROWBEGINUPDATE deptSET location=:new.locationWHERE dept_name=:old.dept_name;END;/
Koodi selgitus
- Koodirida 39: „UPDATE“ sündmuse INSTEAD OF loomine kuval „guru99_emp_view“ ROW-tasemel. See sisaldab värskenduslauset asukoha värskendamiseks baastabelis 'dept'.
- Koodirida 44: Värskenduslause kasutab enne ja pärast värskendust veergude väärtuse leidmiseks ': NEW' ja ': OLD'.
Väljund
Käivitus on loodud
Samm 6) Vaate värskendamine päästiku asemel. Nüüd viga ei tule, kuna "päästiku asemel" tegeleb selle keerulise vaate värskendustoiminguga. Ja kui kood on täidetud, värskendatakse töötaja XXX asukohta "Jaapanist" "Prantsusmaa".
BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX';COMMIT;END;/
SELECT * FROM guru99_emp_view;
Koodi selgitus:
- Koodirida 49–53: „XXX” asukoha värskendamine asukohaks „FRANCE”. See on edukas, kuna päästik „INSTEAD OF” on peatanud vaates tegeliku värskenduse avalduse ja värskendanud põhitabelit.
- Koodirida 55: uuendatud kirje kontrollimine.
Väljund:
PL / SQL-i protseduur on edukalt lõpule viidud
TÖÖTAJA | DEPT_NAME | ASUKOHT |
ZZZ | HR | USA |
AAAA | MÜÜK | Suurbritannia |
XXX | RAHALINE | PRANTSUSMAA |
Ühendi päästik
Ühendi päästik on päästik, mis võimaldab teil määrata toiminguid kõigi nelja ajavõtupunkti jaoks ühes päästiku kehas. Neli erinevat ajastuspunkti, mida see toetab, on järgmine.
- ENNE AVALDUST - tase
- ENNE RIDA - tase
- PÄRAST RIDA - tase
- PÄRAST AVALDUST - tase
See annab võimaluse kombineerida erinevate ajastuste tegevused samaks päästikuks.
CREATE [ OR REPLACE ] TRIGGERFOR[INSERT | UPDATE | DELET… .]ON BEFORE STATEMENT ISBEGIN ;END BEFORE STATEMENT;BEFORE EACH ROW ISBEGIN ;END EACH ROW;AFTER EACH ROW ISBEGIN ;END AFTER EACH ROW;AFTER STATEMENT ISBEGIN ;END AFTER STATEMENT;END;
Süntaksi selgitus:
- Ülaltoodud süntaks näitab päästiku „COMPOUND” loomist.
- Deklaratiivne sektsioon on tavaline kogu käivitamisploki täitmisbloki jaoks.
- Need 4 ajastusplokki võivad olla mis tahes järjestuses. Kõiki neid 4 ajablokki pole kohustuslik omada. COMPOUND-päästiku saame luua ainult vajalike ajastuste jaoks.
Näide 1 : Selles näites loome käivitaja palgaveeru automaatselt täitmiseks vaikeväärtusega 5000.
CREATE TRIGGER emp_trigFOR INSERTON empCOMPOUND TRIGGERBEFORE EACH ROW ISBEGIN: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;
Koodi selgitus:
- Koodirida 2-10 : liit-päästiku loomine. See on loodud ajastamiseks ENNE RIDA-taset, et sisestada palk vaikeväärtusega 5000. See muudab palga vaikeväärtuseks „5000” enne kirje tabelisse sisestamist.
- Koodirida 11–14 : sisestage kirje tabelisse „emp”.
- Koodirida 16 : sisestatud kirje kontrollimine.
Väljund:
Käivitaja on loodud
PL / SQL-i protseduur on edukalt lõpule viidud.
EMP_NAME | EMP_NO | PALK | JUHT | DEPT_NO |
CCC | 1004 | 5000 | AAA | 30 |
Käivitajate lubamine ja keelamine
Käivitajaid saab lubada või keelata. Päästiku lubamiseks või keelamiseks tuleb selle keelava või lubava päästiku jaoks anda käsk ALTER (DDL).
Allpool on päästikute lubamise / keelamise süntaks.
ALTER TRIGGER[ENABLE|DISABLE];ALTER TABLE [ENABLE|DISABLE] ALL TRIGGERS;
Süntaksi selgitus:
- Esimene süntaks näitab, kuidas lubada / keelata üks päästik.
- Teine lause näitab, kuidas lubada / keelata kõik päästikud konkreetses tabelis.
Kokkuvõte
Selles peatükis oleme õppinud tundma PL / SQL-i päästikuid ja nende eeliseid. Oleme õppinud ka erinevaid klassifikatsioone ja arutanud päästiku ja ÜHISE päästiku asemel.