Oracle PL/SQL-i käivitamise õpetus: liite asemel [näide]
Mis on Trigger PL/SQL-is?
TRIGGERID on salvestatud programmid, mis käivitatakse Oracle mootor automaatselt, kui tabelis käivitatakse DML-i laused, nagu lisamine, värskendamine, kustutamine või mõned sündmused. Käivituse korral käivitatava koodi saab määratleda vastavalt nõudele. Saate valida sündmuse, mille korral päästik käivitada, ja täitmise aja. Päästiku eesmärk on säilitada andmebaasis oleva teabe terviklikkus.
Päästikute eelised
Allpool on toodud päästikute eelised.
- Mõne tuletatud veeru väärtuse automaatne genereerimine
- Viite terviklikkuse jõustamine
- Sündmuste logimine ja teabe salvestamine tabelijuurdepääsu kohta
- Auditeerimine
- Synctabelite kroonne replikatsioon
- Turvavolituste kehtestamine
- Kehtetute tehingute vältimine
Käivitajate tüübid Oracle
Päästikuid saab klassifitseerida järgmiste parameetrite alusel.
- Klassifikatsioon põhineb ajastamine
- ENNE Päästikut: see käivitub enne määratud sündmuse toimumist.
- AFTER Päästiku: see käivitub pärast määratud sündmuse toimumist.
- Päästiku ASEMEL: eritüüp. Edasiste teemade kohta saate lisateavet. (ainult DML-i jaoks)
- Klassifikatsioon põhineb tase
- STATEMENT taseme päästik: see käivitub määratud sündmuse avalduse korral üks kord.
- ROW taseme päästik: see käivitub iga kirje puhul, mida määratud sündmus mõjutas. (ainult DML-i jaoks)
- Klassifikatsioon põhineb sündmus
- DML-i 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)
Seega on iga päästik ülaltoodud parameetrite kombinatsioon.
Päästiku loomine
Allpool on päästiku loomise süntaks.
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;
Süntaksi selgitus:
- Ülaltoodud süntaks näitab erinevaid valikulisi lauseid, mis on päästiku loomisel olemas.
- ENNE/ PÄRAST määrab sündmuste ajastused.
- SISESTAMINE/VÄRSKENDAMINE/LOGUN/LOO/jne. määrab sündmuse, mille puhul päästik tuleb käivitada.
- ON-klausel määrab, millisel objektil ülalmainitud sündmus kehtib. Näiteks on see tabeli nimi, millel DML-i käivitaja korral võib DML-i sündmus toimuda.
- Käsk „FOR EACH ROW” määrab ROW taseme päästiku.
- WHEN-klausel määrab lisatingimuse, mille korral päästik peab käivituma.
- Deklaratsiooniosa, täitmise osa, erandite käsitlemise osa on samad, mis teisel PL/SQL plokid. Deklaratsiooniosa ja erandi käsitlemise osa on valikulised.
:NEW ja :OLD klausel
Reataseme päästik käivitub iga seotud rea puhul. Ja mõnikord on vaja teada väärtust enne ja pärast DML-lauset.
Oracle on nende väärtuste hoidmiseks lisanud RECORD-taseme päästikusse kaks klauslit. Neid klausleid saame kasutada vanadele ja uutele väärtustele viitamiseks päästiku keha sees.
- :NEW – see hoiab käivitamise ajal põhitabeli/vaate veergude jaoks uut väärtust
- :OLD – see hoiab käivitamise ajal põhitabeli/vaate veergude vana väärtust
Seda klauslit tuleks kasutada DML-i sündmuse põhjal. Allolev tabel täpsustab, milline klausel millise DML-lause jaoks kehtib (INSERT/UPDATE/DELETE).
INSERT | UPDATE | Kustuta | |
---|---|---|---|
:UUS | kehtiv | kehtiv | KEHTETU. Kustutamise korral pole uut väärtust. |
:VANA | KEHTETU. Sisestatud tähises pole vana väärtust | kehtiv | kehtiv |
Päästiku ASEMEL
"Päästiku asemel" on päästiku eritüüp. Seda kasutatakse ainult DML-i käivitajates. Seda kasutatakse juhul, kui kompleksvaates toimub mis tahes DML-sündmus.
Vaatleme näidet, kus vaade tehakse kolmest põhitabelist. Kui selle vaate kaudu väljastatakse mis tahes DML-sündmus, muutub see kehtetuks, kuna andmed võetakse kolmest erinevast tabelist. Nii et selle asemel kasutatakse päästikut. Päästikut INSTEAD OF kasutatakse põhitabelite otse muutmiseks antud sündmuse vaate muutmise asemel.
Näiteks 1: Selles näites loome kahest põhitabelist keeruka vaate.
- Tabel_1 on emp tabel ja
- Tabel_2 on osakondade tabel.
Seejärel näeme, kuidas selle keerulise vaate asukoha üksikasjade avalduse UPDATE väljastamiseks kasutatakse päästikut INSTEED OF. Samuti näeme, kuidas :NEW ja :OLD on päästikutes kasulikud.
- 1. samm: vastavate veergudega tabelite 'emp' ja 'dept' loomine
- 2. samm: täitke tabel näidisväärtustega
- 3. samm: ülaltoodud tabeli vaate loomine
- 4. toiming: värskendage vaadet enne päästiku asemel
- 5. samm: päästiku asemel käivitaja loomine
- 6. toiming: vaate värskendamine pärast päästiku asemel
Step 1) Tabelite 'emp' ja 'dept' loomine sobivate 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 loodud
Step 2) Nüüd, kuna oleme tabeli loonud, täidame selle tabeli ülaltoodud tabelite näidisväärtuste ja vaadete loomisega.
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; /
Koodi selgitus
- Koodirida 13-19: andmete sisestamine 'osakonna' tabelisse.
- Koodirida 20–26: Andmete sisestamine tabelisse 'emp'.
Väljund
PL/SQL protseduur valmis
Step 3) Vaate loomine ülaltoodud tabeli jaoks.
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;
Koodi selgitus
- Koodirida 27–32: Vaate 'guru99_emp_view' loomine.
- Koodirida 33: Päringu guru99_emp_view.
Väljund
Vaade loodud
EMPLOYEE_NAME | DEPT_NAME | ASUKOHT |
---|---|---|
Zzz | HR | USA |
YYY | SALES | UK |
XXX | FINANCIAL | Jaapan |
Step 4) Vaate värskendamine enne päästikut.
BEGIN UPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name=:'XXX’; COMMIT; END; /
Koodi selgitus
- Koodirida 34–38: Värskendage „XXX” asukohaks „PRANTSUSMAA”. See tekitas erandi, kuna DML avaldused pole kompleksvaates lubatud.
Väljund
ORA-01779: ei saa muuta veergu, mis vastab võtmeta säilitatavale tabelile
ORA-06512: real 2
Step 5)Et vältida vigade ilmnemist eelmises etapis vaate värskendamisel, kasutame selles etapis käsku "päästiku asemel".
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; /
Koodi selgitus
- Koodirida 39: ROW-tasemel vaates 'guru99_emp_view' sündmuse „UPDATE” päästiku INSTEEAD OF loomine. See sisaldab värskenduslauset asukoha värskendamiseks baastabeli 'osakonnas'.
- Koodirida 44: Värskenduslause kasutab veergude väärtuste leidmiseks enne ja pärast värskendamist väärtusi „:NEW” ja „: OLD”.
Väljund
Päästik loodud
Step 6) Vaate värskendamine pärast päästiku asemel. Nüüd tõrget ei tule, kuna selle keeruka vaate värskendamise toiminguga tegeleb „päästiku asemel”. Ja kui kood on käivitatud, värskendatakse töötaja XXX asukohta "Jaapanist" "Prantsusmaa".
BEGIN UPDATE 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 PRANTSUSMAAKS. See on edukas, kuna päästik 'INSTEAD OF' on peatanud tegeliku värskendusavalduse kuvamisel ja viinud läbi baastabeli värskendamise.
- Koodirida 55: Värskendatud kirje kontrollimine.
Väljund:
PL/SQL protseduur edukalt lõpule viidud
EMPLOYEE_NAME | DEPT_NAME | ASUKOHT |
---|---|---|
Zzz | HR | USA |
YYY | SALES | UK |
XXX | FINANCIAL | PRANTSUSMAA |
Ühendpäästik
Ühendpäästik on päästik, mis võimaldab määrata toimingud iga nelja ajastuspunkti jaoks ühes päästikosas. Neli erinevat ajastuspunkti, mida see toetab, on järgmised.
- ENNE AVALDUST – tase
- ENNE RIDA – tase
- PÄRAST RIDA – tase
- PÄRAST AVALDUST – tase
See annab võimaluse kombineerida eri ajastustega seotud toiminguid samasse päästikusse.
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;
Süntaksi selgitus:
- Ülaltoodud süntaks näitab päästiku „COMPOUND” loomist.
- Deklaratiivne jaotis on ühine kõigi päästiku keha täitmisplokkide jaoks.
- Need 4 ajastusplokki võivad olla mis tahes järjestuses. Kõigi nende 4 ajastusplokki omamine ei ole kohustuslik. Saame luua COMPOUND-päästiku ainult vajalike ajastuste jaoks.
Näiteks 1: selles näites loome käivitaja, et täita palga veerg automaatselt vaikeväärtusega 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;
Koodi selgitus:
- Koodirida 2-10: liitpäästiku loomine. See on loodud ajastamiseks ENNE RIDA taset, et täita palk vaikeväärtusega 5000. See muudab palga enne kirje tabelisse lisamist vaikeväärtuseks '5000'.
- Koodirida 11-14: Sisestage kirje tabelisse 'emp'.
- Koodirida 16: sisestatud kirje kontrollimine.
Väljund:
Päästik loodud
PL/SQL protseduur edukalt lõpule viidud.
EMP_NAME | EMP_NO | SALARY | MANAGER | DEPT_NO |
---|---|---|---|---|
CCC | 1004 | 5000 | AAA | 30 |
Päästikute lubamine ja keelamine
Päästikuid saab lubada või keelata. Päästiku lubamiseks või keelamiseks tuleb selle keelava või lubava päästiku kohta anda ALTER (DDL) avaldus.
Allpool on süntaks päästikute lubamiseks/keelamiseks.
ALTER TRIGGER <trigger_name> [ENABLE|DISABLE]; ALTER TABLE <table_name> [ENABLE|DISABLE] ALL TRIGGERS;
Süntaksi selgitus:
- Esimene süntaks näitab, kuidas üksikpäästikut lubada/keelata.
- Teine avaldus näitab, kuidas lubada/keelata kõiki konkreetse tabeli päästikuid.
kokkuvõte
Selles peatükis oleme õppinud tundma PL/SQL-i käivitajaid ja nende eeliseid. Samuti oleme õppinud erinevaid klassifikatsioone ja arutanud päästiku ja LIIDIST päästiku ASEMEL.