Oracle PL/SQL-liipaisin: Yhdistetyyppien & sijaan
โก รlykรคs yhteenveto
PL/SQL-liipaisimet ovat tallennettuja ohjelmia, jotka Oracle moottori kรคynnistyy automaattisesti, kun DML-, DDL- tai tietokantatapahtuma tapahtuu. Ne yllรคpitรคvรคt tietojen eheyttรค, valvovat sรครคntรถjรค ja tukevat tarkastusta, ja ne sisรคltรคvรคt BEFORE-, AFTER-, INSTEAD OF- ja yhdistetyt tyypit.

Mikรค on Trigger PL/SQL:ssรค?
LรPรISYT tallennetaan PL / SQL ohjelmat, jotka laukaisevat Oracle moottori automaattisesti, kun DML-lauseet kuten lisรคys, pรคivitys ja poisto suoritetaan taulukossa tai kun joitakin tapahtumia tapahtuu. Liipaisimen tapauksessa suoritettava koodi voidaan mรครคritellรค vaatimuksen mukaan. Voit valita tapahtuman, jonka jรคlkeen liipaisin on laukaistava, ja suorituksen ajoituksen. Liipaisimen tarkoituksena on yllรคpitรครค tietojen eheyttรค tietokannassa.
Triggerien edut
Seuraavassa on triggerien edut.
- Joitakin johdettuja sarakearvoja luodaan automaattisesti
- Viittauksen eheyden varmistaminen
- Tapahtumaloki ja tietojen tallentaminen pรถytรคkรคyttรถรถn
- Tilintarkastus
- Synctaulukoiden kroninen kopiointi
- Turvallisuuslupien asettaminen
- Virheellisten tapahtumien estรคminen
Triggerien tyypit Oracle
Triggerit voidaan luokitella seuraavien parametrien perusteella.
Luokittelu ajoituksen perusteella
- ENNEN Liipaisinta: Se kรคynnistyy ennen mรครคritetyn tapahtuman tapahtumista.
- JรLKEEN Liipaisin: Se kรคynnistyy mรครคritetyn tapahtuman jรคlkeen.
- Liipaisimen sijaan: Erikoistyyppi. Lisรคtietoja seuraavista aiheista. (vain DML:lle)
Luokittelu tason perusteella
- STATEMENT-tason liipaisin: Se laukeaa kerran mรครคritetyn tapahtumalausekkeen mukaisesti.
- ROW-tason liipaisin: Se kรคynnistyy jokaisen tietueen kohdalla, johon mรครคritetty tapahtuma vaikuttaa. (vain DML:lle)
Luokittelu tapahtuman perusteella
- DML-liipaisin: Se kรคynnistyy, kun DML-tapahtuma on mรครคritetty (INSERT/UPDATE/DELETE).
- DDL-liipaisin: Se kรคynnistyy, kun DDL-tapahtuma on mรครคritetty (CREATE/ALTER).
- TIETOKANTA-liipaisin: Se kรคynnistyy, kun tietokantatapahtuma on mรครคritetty (LOGON/LOGOFF/STARTUP/SHUTDOWN).
Joten jokainen liipaisin on yhdistelmรค yllรค olevista parametreista.
Kuinka luoda triggeri
Alla on syntaksi liipaisimen luomiseksi. Alla oleva kuvakaappaus nรคyttรครค tรคmรคn liipaisimen luomissyntaksin muodossa Oracle.
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;
Syntaksiselitys:
- Yllรค oleva syntaksi nรคyttรครค erilaiset valinnaiset lauseet, jotka ovat lรคsnรค liipaisimen luomisessa.
- BEFORE/AFTER mรครคrittรครค tapahtumien ajankohdat.
- LISรร/PรIVITYS/KIRJAUDU/LUO/jne. mรครคrittรครค tapahtuman, jota varten laukaisu on kรคynnistettรคvรค.
- ON-lauseke mรครคrittรครค objektin, jolle edellรค mainittu tapahtuma on voimassa. Tรคmรค on esimerkiksi sen taulukon nimi, jolle DML-tapahtuma voi tapahtua DML-liipaisimen tapauksessa.
- Komento โFOR EACH ROWโ mรครคrittรครค rivitason liipaisimen.
- WHEN-lauseke mรครคrittรครค lisรคehdon, jossa liipaisimen on laukaistava.
- Mรครคrittelyosa, suoritusosa ja poikkeusten kรคsittelyosa ovat samat kuin muissakin PL/SQL-lohkotIlmoitusosa ja poikkeusten kรคsittely osat ovat valinnaisia.
:NEW ja :OLD lauseke
Rivitason triggerissรค triggeri kรคynnistyy kullekin liittyvรคlle riville. Ja joskus on tarpeen tietรครค arvo ennen ja jรคlkeen DML-kรคskyn.
Oracle on tarjonnut rivitason liipaisimessa kaksi lauseketta nรคiden arvojen sรคilyttรคmistรค varten. Voimme kรคyttรครค nรคitรค lausekkeita viitataksemme liipaisimen rungon sisรคllรค oleviin vanhoihin ja uusiin arvoihin.
- : UUSI โ Se sรคilyttรครค uuden arvon perustaulukon/nรคkymรคn sarakkeille liipaisimen suorituksen aikana.
- :VANHA โ Se sรคilyttรครค perustaulukon/nรคkymรคn sarakkeiden vanhan arvon liipaisimen suorituksen aikana.
Tรคtรค lauseketta tulisi kรคyttรครค DML-tapahtuman perusteella. Alla oleva taulukko mรครคrittรครค, mikรค lauseke on kelvollinen millekin DML-lausekkeelle (INSERT/UPDATE/DELETE).
| INSERT | PรIVITYS | POISTA | |
|---|---|---|---|
| : UUSI | PรTEVร | PรTEVร | POISTOARVOTON. Poistotapauksessa ei ole uutta arvoa. |
| :VANHA | VIRHEELLINEN. Merkkijonossa ei ole vanhaa arvoa. | PรTEVร | PรTEVร |
Liipaisimen SIJAAN
โINSTEAD OF -liipaisinโ on erityinen liipaisintyyppi. Sitรค kรคytetรครคn vain DML-liipaisimissa. Sitรค kรคytetรครคn, kun jokin DML-tapahtuma on tapahtumassa monimutkaisessa nรคkymรคssรค.
Tarkastellaan esimerkkiรค, jossa nรคkymรค luodaan kolmesta perustaulukosta. Kun jokin DML-tapahtuma suoritetaan tรคmรคn nรคkymรคn kautta, siitรค tulee virheellinen, koska tiedot otetaan kolmesta eri taulukosta. Tรคssรค tapauksessa kรคytetรครคn siis INSTEAD OF -liipaisinta. INSTEAD OF -liipaisinta kรคytetรครคn suoraan perustaulukoiden muokkaamiseen sen sijaan, ettรค nรคkymรครค muokattaisiin tietyn tapahtuman osalta.
Esimerkki 1: Tรคssรค esimerkissรค luomme monimutkaisen nรคkymรคn kahdesta perustaulukosta, jossa Table_1 on emp-taulukko ja Table_2 on osastotaulukko.
Seuraavaksi katsomme, miten INSTEAD OF -liipaisinta kรคytetรครคn sijaintitietojen PรIVITYKSEN (UPDATE) antamiseen tรคssรค monimutkaisessa nรคkymรคssรค. Katsomme myรถs, miten :NEW ja :OLD ovat hyรถdyllisiรค liipaisimissa. Esimerkki tehdรครคn seuraavissa vaiheissa:
- Vaihe 1: Taulukoiden 'emp' ja 'dept' luominen asianmukaisilla sarakkeilla
- Vaihe 2: Taulukoiden tรคyttรคminen esimerkkiarvoilla
- Vaihe 3: Nรคkymรคn luominen yllรค luoduille taulukoille
- Vaihe 4: Nรคkymรคn pรคivittรคminen ennen INSTEAD OF -liipaisinta
- Vaihe 5: INSTEAD OF -liipaisimen luominen
- Vaihe 6: Nรคkymรคn pรคivitys INSTEAD OF -liipaisimen jรคlkeen
Vaihe 1) Luodaan taulukot 'emp' ja 'dept' sopivilla sarakkeilla.
Alla oleva kuvakaappaus nรคyttรครค 'emp'- ja 'dept'-perustaulukoiden luomisen ohjelmassa Oracle.
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 Selitys
- Code rivi 1โ7: Taulukon 'emp' luonti.
- Code rivi 8โ12: Taulukon 'osasto' luonti.
lรคhtรถ:
Table Created
Vaihe 2) Koska olemme nyt luoneet taulukot, tรคytรคmme ne esimerkkiarvoilla.
Alla olevassa kuvakaappauksessa nรคytetรครคn esimerkkirivien lisรครคminen 'dept'- ja 'emp'-taulukoihin.
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,'XXX',15000,'AAA',30); INSERT INTO EMP VALUES(1001,'YYY',18000,'AAA',20) ; INSERT INTO EMP VALUES(1002,'ZZZ',20000,'AAA',10); COMMIT; END; /
Code Selitys
- Code rivi 13โ19: Tietojen lisรครคminen 'dept'-taulukkoon.
- Code rivi 20โ26: Tietojen lisรครคminen 'emp'-taulukkoon.
lรคhtรถ:
PL/SQL procedure completed
Vaihe 3) Nรคkymรคn luominen yllรค luoduille taulukoille.
Alla olevassa kuvakaappauksessa nรคkyy, kuinka monimutkainen nรคkymรค luodaan ja sitรค sitten kysellรครคn.
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 Selitys
- Code rivi 27โ32: 'guru99_emp_view'-nรคkymรคn luominen.
- Code rivi 33: Kysely guru99_emp_view.
lรคhtรถ:
View created
| TYรNTEKIJรN NIMI | DEPT_NAME | SIJAINTI |
|---|---|---|
| ZZZ | HR | Soumi |
| YYY | MYYNTI | UK |
| XXX | TALOUDELLINEN | JAPANI |
Vaihe 4) Nรคkymรคn pรคivitys ennen INSTEAD OF -liipaisinta.
Alla oleva kuvakaappaus nรคyttรครค pรคivitysyrityksen kompleksinรคkymรคssรค ja siitรค johtuvan virheen.
BEGIN UPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX'; COMMIT; END; /
Code Selitys
- Code rivi 34โ38: Pรคivitรค โXXXโ:n sijainniksi 'FRANCE'. Se aiheutti poikkeuksen, koska DML-lausekkeita ei sallita suoraan kompleksinรคkymรคssรค.
lรคhtรถ:
ORA-01779: cannot modify a column which maps to a non key-preserved table ORA-06512: at line 2
Vaihe 5) Vรคlttรครคksemme edellisessรค vaiheessa nรคkymรคn pรคivittรคmisen aikana ilmenneen virheen, kรคytรคmme tรคssรค vaiheessa โINSTEAD OFโ -liipaisinta.
Alla oleva kuvakaappaus nรคyttรครค INSTEAD OF -liipaisimen luomisen.
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 Selitys
- Code rivi 39: INSTEAD OF -liipaisimen luonti 'UPDATE'-tapahtumalle 'guru99_emp_view'-nรคkymรคssรค ROW-tasolla. Se sisรคltรครค update-lausekkeen, joka pรคivittรครค sijainnin perustaulukossa 'dept'.
- Code rivi 44: Pรคivityslauseke kรคyttรครค ':NEW'- ja ':OLD'-muuttujaa sarakkeiden arvon lรถytรคmiseen ennen pรคivitystรค ja sen jรคlkeen.
lรคhtรถ:
Trigger Created
Vaihe 6) Nรคkymรคn pรคivitys INSTEAD OF -liipaisimen jรคlkeen. Virhettรค ei enรครค ilmene, koska โINSTEAD OF -liipaisinโ kรคsittelee tรคmรคn monimutkaisen nรคkymรคn pรคivitystoiminnon. Kun koodi suoritetaan, tyรถntekijรคn XXX sijainti pรคivittyy โJapanistaโ muotoon โRanskaโ.
Alla oleva kuvakaappaus nรคyttรครค onnistuneen pรคivityksen INSTEAD OF -liipaisimen avulla ja pรคivitetyn nรคkymรคn.
BEGIN UPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX'; COMMIT; END; /
SELECT * FROM guru99_emp_view;
Code Selitys:
- Code rivi 49โ53: Sijainnin โXXXโ pรคivitys muotoon 'FRANCE'. Pรคivitys onnistuu, koska liipaisin 'INSTEAD OF' on pysรคyttรคnyt varsinaisen pรคivityskรคskyn nรคkymรคlle ja suorittanut perustaulukon pรคivityksen.
- Code rivi 55: Pรคivitetyn tietueen tarkistaminen.
lรคhtรถ:
PL/SQL procedure successfully completed
| TYรNTEKIJรN NIMI | DEPT_NAME | SIJAINTI |
|---|---|---|
| ZZZ | HR | Soumi |
| YYY | MYYNTI | UK |
| XXX | TALOUDELLINEN | RANSKA |
Yhdistelmรคlaukaisu
Yhdistetyn liipaisimen avulla voit mรครคrittรครค toiminnot jokaiselle neljรคlle ajoituspisteelle yhdessรค liipaisimen rungossa. Sen tukemat neljรค erilaista ajoituspistettรค ovat seuraavat.
- ENNEN LAUSUNTOA โ taso
- ENNEN RIVAA โ taso
- RIVIN JรLKEEN โ taso
- LAUSUNNON JรLKEEN โ taso
Se tarjoaa mahdollisuuden yhdistรครค eri ajoitusten toiminnot samaan liipaisimeen.
Alla oleva kuvakaappaus nรคyttรครค yhdistetyn liipaisimen syntaksin ja sen neljรค ajoitusosiota.
CREATE [ OR REPLACE ] TRIGGER <trigger_name> FOR [INSERT | UPDATE | DELETE.......] 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;
Syntaksiselitys:
- Yllรค oleva syntaksi nรคyttรครค 'COMPOUND'-liipaisimen luomisen.
- Deklaratiiviosa on yhteinen kaikille liipaisimen rungon suorituslohkoille.
- Nรคmรค neljรค ajoituslohkoa voivat olla missรค tahansa jรคrjestyksessรค. Kaikkien neljรคn ajoituslohkon olemassaolo ei ole pakollista. Voimme luoda COMPOUND-liipaisimen vain tarvittaville ajoituksille.
Esimerkki 1: Tรคssรค esimerkissรค luomme liipaisimen, joka tรคyttรครค palkkasarakkeen automaattisesti oletusarvolla 5000.
Alla oleva kuvakaappaus nรคyttรครค yhdistetyn liipaisimen esimerkin ja sen tulosteen.
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 Selitys:
- Code rivi 2โ10: Yhdistetyn liipaisimen luonti. Se luodaan BEFORE ROW -tasolle, jotta palkkaan lisรคtรครคn oletusarvo 5000. Tรคmรค muuttaa palkan oletusarvoon '5000' ennen tietueen lisรครคmistรค tauluun.
- Code rivi 11โ14: Lisรครค tietue 'emp'-taulukkoon.
- Code rivi 16: Lisรคtyn tietueen varmentaminen.
lรคhtรถ:
Trigger created PL/SQL procedure successfully completed.
| EMP_NAME | EMP_NO | PALKKA | MANAGER | DEPT_NO |
|---|---|---|---|---|
| CCC | 1004 | 5000 | AAA | 30 |
Triggerien ottaminen kรคyttรถรถn ja poistaminen kรคytรถstรค
Liipaisimet voidaan ottaa kรคyttรถรถn tai poistaa kรคytรถstรค. Liipaisimen ottamiseksi kรคyttรถรถn tai poistamiseksi kรคytรถstรค on annettava ALTER (DDL) -lauseke liipaisimelle, joka poistaa sen kรคytรถstรค tai ottaa sen kรคyttรถรถn.
Alla on syntaksi liipaisimien kรคyttรถรถnottoa/poistamista varten.
ALTER TRIGGER <trigger_name> [ENABLE|DISABLE]; ALTER TABLE <table_name> [ENABLE|DISABLE] ALL TRIGGERS;
Syntaksiselitys:
- Ensimmรคinen syntaksi nรคyttรครค, kuinka yksittรคinen liipaisin otetaan kรคyttรถรถn/pois kรคytรถstรค.
- Toinen lause nรคyttรครค, kuinka kaikki tietyn taulukon triggerit otetaan kรคyttรถรถn tai poistetaan kรคytรถstรค.









