mikä on Trigger PL/SQL: ssä?
käynnistimet ovat tallennettuja ohjelmia, jotka Oracle engine laukaisee automaattisesti, kun DML-lausekkeet, kuten insert, update, delete suoritetaan pöydällä tai joitakin tapahtumia tapahtuu. Kynnystilanteessa excecuted-koodi voidaan määritellä vaatimuksen mukaisesti. Voit valita tapahtuman, jolloin liipaisin on laukaistava, ja suorituksen ajankohdan. Triggerin tarkoituksena on ylläpitää tietokannassa olevien tietojen eheyttä.
tässä tutoriaalissa opit –
- liipaisimien edut
- liipaisimien tyypit Oraclessa
- miten liipaisimen luominen
- :uusi ja :vanha lauseke
- liipaisimen sijaan
liipaisimien edut
seuraavat ovat liipaisimien edut.
- joidenkin johdettujen sarakearvojen luominen automaattisesti
- viitteellisen eheyden valvominen
- tapahtumien kirjaaminen ja tietojen tallentaminen taulukkoon pääsystä
- auditointi
- taulukoiden synkroninen toisintaminen
- Turvallisuusvaltuutusten asettaminen
- virheellisten tapahtumien estäminen
Oraclen käynnistimien tyypit
käynnistimet voidaan luokitella seuraavien parametrien perusteella.
- ajoitukseen perustuva luokitus
- ennen laukaisua: se ampuu ennen kuin määrätty tapahtuma on tapahtunut.
- laukaisun jälkeen: se laukeaa määritellyn tapahtuman tapahduttua.
- liipaisimen sijaan: erikoinen tyyppi. Saat lisätietoja muista aiheista. (vain DML: n osalta )
- tason
- STATEMENT level Trigger mukainen luokitus: se ampuu yhden kerran määritellystä tapahtumalausekkeesta.
- rivitason Trigger: se ampuu jokaisen levyn, joka sai vaikuttaa määritetyssä tapahtumassa. (vain DML: n osalta)
- DML-laukaisija: se laukeaa, kun DML-tapahtuma on määritelty (INSERT/UPDATE/DELETE)
- DDL-laukaisija: Se laukeaa, kun DDL-tapahtuma on määritetty (CREATE/ALTER)
- DATABASE Trigger: se laukeaa, kun tietokantatapahtuma on määritetty (LOGON/LOGOFF/STARTUP/SHUTDOWN)
joten jokainen laukaisija on edellä mainittujen parametrien yhdistelmä.
Kuinka luoda liipaisin
alla on syntaksi liipaisimen luomiseksi.
CREATE TRIGGER <trigger_name> ON<name of underlying object> DECLARE<Declaration part>BEGIN<Execution part> EXCEPTION<Exception handling part> END;
Syntaksiselitys:
- yllä oleva syntaksi näyttää erilaiset valinnaiset lausekkeet, jotka ovat läsnä liipaisinluonnissa.
- ennen / jälkeen tarkentaa tapahtuman aikataulut.
- Lisää / päivitä / Kirjaudu / luo / etc. määrittää tapahtuman, jossa liipaisin on laukaistava.
- on lauseke määrittää, mille objektille edellä mainittu tapahtuma on voimassa. Tämä on esimerkiksi taulukon nimi, jossa DML-tapahtuma voi esiintyä DML-käynnistimen tapauksessa.
- komento ”jokaiselle riville” määrittää rivitason käynnistimen.
- milloin lauseke määrittelee lisäehdon, jossa liipaisimen on tulitettava.
- julistusosa, suoritusosa, poikkeuksen käsittelyosa on sama kuin muissa PL / SQL-lohkoissa. Ilmoituksen osa ja poikkeuksen käsittelyosa ovat valinnaisia.
:uusi ja :vanha lauseke
rivitason liipaisimessa liipaisin laukeaa jokaiselle asiaan liittyvälle riville. Ja joskus se on tarpeen tietää arvo ennen ja jälkeen DML lauseke.
Oracle on antanut kaksi lauseketta ennätystason Triggeriin näiden arvojen pitämiseksi. Voimme käyttää näitä lausekkeita viittaamaan uusiin ja vanhoihin arvoihin laukaisurungon sisällä.
- :Uusi-sillä on uusi arvo perustaulukon/näkymän sarakkeille käynnistystoteutuksen aikana
- :vanha – sillä on kantataulukon/näkymän sarakkeiden Vanha arvo käynnistystoteutuksen aikana
tätä lauseketta tulee käyttää DML-tapahtuman perusteella. Alla olevassa taulukossa määritellään, mikä lauseke on voimassa mille DML-lausekkeelle (Lisää / päivitä / poista).
lisää | päivitys | poista | |
: Uusi | voimassa | kelvollinen | virheellinen. Delete-kotelossa ei ole uutta arvoa. |
:Vanha | virheellinen. Insertissä ei ole vanhaa arvoa | VALID | VALID |
liipaisimen sijasta
”liipaisimen sijasta” on erityinen liipaisintyyppi. Sitä käytetään vain DML-laukaisimissa. Sitä käytetään, kun jokin DML-tapahtuma tapahtuu monimutkaisessa näkymässä.
tarkastellaan esimerkkiä, jossa näkymä tehdään 3 kantataulukosta. Kun jokin DML-tapahtuma annetaan tämän näkymän päälle, se tulee mitättömäksi, koska tiedot on otettu 3 eri taulukosta. Joten tässä sijasta laukaista käytetään. Käynnistimen sijasta käytetään pohjataulukoiden muokkaamista suoraan sen sijaan, että muokattaisiin näkymää annetulle tapahtumalle.
Esimerkki 1: Tässä esimerkissä luodaan monimutkainen näkymä kahdesta peruspöydästä.
- Table_1 on emp-taulukko ja
- Table_2 on osastopöytä.
sitten näemme, miten liipaisimen sijasta käytetään tämän monimutkaisen näkymän sijaintitietojen päivitystä. Aiomme myös nähdä, miten: uusi ja: vanha on hyödyllinen laukaisimissa.
- Vaihe 1: Luodaan taulut”emp”ja”dept”asianmukaisine sarakkeineen
- Vaihe 2: täytetään taulukko otosarvoilla
- Vaihe 3: luodaan näkymä yllä olevalle luodulle taululle
- Vaihe 4: näkymän päivitys ennen liipaisimen sijaan
- Vaihe 5: liipaisimen sijaan luominen
- Vaihe 6: näkymän päivitys liipaisimen sijaan
Vaihe 1) luodaan taulukko”emp”ja” dept ”asianmukaisilla sarakkeilla
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));/
koodiselitys
- koodirivi 1-7: Taulukko emp luominen.
- koodirivi 8-12: taulukon ”dept” luominen.
Lähtö
taulukko luotu
Vaihe 2) Nyt kun olemme luoneet taulukon, kansoitamme tämän taulukon otosarvoilla ja luomalla näkymiä yllä oleviin taulukoihin.
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;/
Koodiselitys
- koodirivi 13-19: tietojen lisääminen ”dept” – taulukkoon.
- koodirivi 20-26: tietojen lisääminen ” emp ” – taulukkoon.
Output
PL/SQL procedure completed
Step 3) luodaan näkymä edellä luodulle taululle.
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;
Koodiselitys
- koodirivi 27-32: luodaan ’guru99_emp_view’ näkymä.
- koodirivi 33: Querying guru99_emp_view.
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’. Se nosti poikkeuksen, koska DML-lausumat eivät ole sallittuja monimutkaisessa katsannossa.
Output
ora-01779: ei voi muuttaa saraketta, joka kartoittaa ei-avaimella säilyneeseen taulukkoon
ORA-06512: rivillä 2
Vaihe 5)välttääksemme virhekohtauksen päivitettäessä näkymää edellisessä vaiheessa, tässä vaiheessa aiomme käyttää ”sijaan laukaista.”
CREATE TRIGGER guru99_view_modify_trgINSTEAD OF UPDATEON guru99_emp_viewFOR EACH ROWBEGINUPDATE deptSET location=:new.locationWHERE dept_name=:old.dept_name;END;/
Koodiselitys
- koodirivi 39: ”UPDATE” – tapahtuman käynnistimen sijaan luominen ”guru99_emp_view” – näkymässä RIVITASOLLA. Se sisältää päivitysilmoituksen sijainnin päivittämiseksi perustaulukossa ”dept”.
- koodirivi 44: Update statement käyttää ilmaisuja”: NEW ”ja”: OLD ” sarakkeiden arvon löytämiseksi ennen päivitystä ja sen jälkeen.
Output
Trigger Created
Step 6) näkymän päivitys käynnistimen sijaan. Nyt virhe ei tule, koska ”laukaisun sijaan” hoitaa tämän monimutkaisen näkymän päivitystoiminnan. Ja kun koodi on suoritettu sijainti työntekijän XXX päivitetään ” Ranska ”alkaen” Japani.”
BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX'; COMMIT;END;/
SELECT * FROM guru99_emp_view;
Koodiselitys:
- koodirivi 49-53: päivitetty” xxx”: n sijainti muotoon ”Ranska”. Se on onnistunut, koska ”sen sijaan” – käynnistin on pysäyttänyt varsinaisen päivityslausekkeen näkyvillä ja suorittanut perustaulukon päivityksen.
- koodirivi 55: päivitetyn tietueen tarkistaminen.
Tuotos:
PL/SQL-menettely onnistuneesti suoritettu
EMPLOYEE_NAME | DEPT_NAME | LOCATION | ZZZ | HR | YYY | sales | UK | xxx | financial | Ranska |
compound Trigger
compound trigger on liipaisin, jonka avulla voit määrittää toimia jokaiselle neljälle ajoituspisteelle yhden liipaisimen rungossa. Neljä eri ajoituspiste se tukee on kuten alla.
- ennen LAUSUMATASOA
- ennen RIVITASOA
- rivitason jälkeen
- LAUSUMATASON jälkeen
se tarjoaa mahdollisuuden yhdistää eri ajoitusta koskevat toimet samaan laukaisuun.
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;
Syntaksiselitys:
- yllä oleva syntaksi osoittaa ”yhdisteen” laukaisimen syntymisen.
- Deklaratiivinen osio on yleinen kaikille laukaisurungon toteutuslohkoille.
- nämä 4 ajoituslohkoa voivat olla missä tahansa järjestyksessä. Se ei ole pakollista olla kaikki nämä 4 ajoituslohkot. Voimme luoda YHDISTELMÄLAUKAISIMEN vain vaadittavia aikoja varten.
Esimerkki 1: Tässä esimerkissä luomme liipaisimen, jolla palkkasarake automaattisesti kansoitetaan oletusarvolla 5000.
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;
koodiselitys:
- koodirivi 2-10: yhdisteen laukaisu. Se on luotu ajoituksen ennen RIVITASOA kansoittaa palkka oletusarvo 5000. Tämä muuttaa palkan oletusarvoksi ”5000” ennen tietueen lisäämistä taulukkoon.
- koodirivi 11-14: lisätään tietue ” emp ” – taulukkoon.
- koodirivi 16: lisätyn tietueen tarkistaminen.
Lähtö:
Trigger created
PL / SQL procedure onnistuneesti suoritettu.
EMP_NAME | EMP_NO | palkka | manageri | DEPT_NO |
CCC | 5000 | AAA | 30 |
käynnistimet voidaan ottaa käyttöön tai poistaa käytöstä. Jotta käynnistin voidaan ottaa käyttöön tai poistaa käytöstä, käynnistimelle on annettava ALTER (DDL) – lausunto, joka poistaa sen käytöstä tai ottaa sen käyttöön.
alla on syntaksi käynnistimien käyttöönotolle / käytöstä poistamiselle.
ALTER TRIGGER <trigger_name> ;ALTER TABLE <table_name> ALL TRIGGERS;
Syntaksiselitys:
- ensimmäinen syntaksi näyttää, miten yksittäinen käynnistin otetaan käyttöön / poistetaan käytöstä.
- toinen lauseke näyttää, miten kaikki tietyn taulukon käynnistimet otetaan käyttöön / poistetaan käytöstä.
Yhteenveto
tässä luvussa olemme oppineet PL / SQL-laukaisimista ja niiden eduista. Olemme myös oppineet erilaisia luokituksia ja keskustelleet liipaisimen ja YHDISTELMÄLAUKAISIMEN sijaan.