Mikä on laukaisu PL / SQL: ssä?
TRIGGERS ovat tallennettuja ohjelmia, jotka Oracle-moottori käynnistää automaattisesti, kun taulukossa suoritetaan DML- lauseita, kuten lisäys , päivitys, poisto tai tapahtumia. Liipaisun yhteydessä suoritettava koodi voidaan määrittää vaatimuksen mukaisesti. Voit valita tapahtuman, johon liipaisin on käynnistettävä, ja suorituksen ajoituksen. Laukaisun tarkoituksena on ylläpitää tietokannan tietojen eheyttä.
Tässä opetusohjelmassa opit-
- Triggerien edut
- Oracle-laukaisintyypit
- Kuinka luoda laukaisin
- : UUSI ja: VANHA lauseke
- Liipaisun sijasta
- Yhdisteen liipaisin
Triggerien edut
Seuraavassa on laukaisijoiden edut.
- Jotkin johdetut sarakearvot luodaan automaattisesti
- Viitteiden eheyden täytäntöönpano
- Tapahtumien kirjaaminen ja tietojen tallentaminen pöydän käyttöoikeuksiin
- Tarkastus
- Taulukoiden synkroninen replikointi
- Turvalupien asettaminen
- Virheellisten tapahtumien estäminen
Oracle-laukaisintyypit
Triggerit voidaan luokitella seuraavien parametrien perusteella.
- Luokittelu ajoituksen perusteella
- ENNEN liipaisinta: Se käynnistyy ennen määritetyn tapahtuman tapahtumista.
- Laukaisun jälkeen: Se käynnistyy määritetyn tapahtuman jälkeen.
- Liipaisimen sijasta: Erityistyyppi. Opit lisää muista aiheista. (vain DML)
- Luokittelu tason perusteella
- STATEMENT-tason liipaisin: Se käynnistää kerran määritettyä tapahtumalausetta varten.
- RIVitasoinen liipaisin: Se käynnistyy jokaisen tietueen kohdalla, johon määritetty tapahtuma vaikuttaa. (vain DML)
- 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)
- DATABASE Trigger: Se käynnistyy, kun tietokantatapahtuma on määritetty (LOGON / LOGOFF / STARTUP / SHUTDOWN)
Joten jokainen laukaisu on yllä olevien parametrien yhdistelmä.
Kuinka luoda laukaisin
Alla on liipaisimen luomisen syntaksi.
CREATE [ OR REPLACE ] TRIGGER[BEFORE | AFTER | INSTEAD OF ][INSERT | UPDATE | DELETE… ]ON [FOR EACH ROW][WHEN ]DECLARE BEGIN EXCEPTION END;
Syntaksi Selitys:
- Yllä oleva syntaksi näyttää erilaiset valinnaiset lauseet, joita läsnä on käynnistimen luomisessa.
- ENNEN / JÄLKEEN määrittää tapahtuman ajoitukset.
- INSERT / UPDATE / LOGON / CREATE / jne. määrittää tapahtuman, jonka laukaisu on käynnistettävä.
- ON-lauseke määrittää, mille objektille yllä mainittu tapahtuma on kelvollinen. Esimerkiksi tämä on taulukon nimi, jolla DML-tapahtuma voi esiintyä DML-liipaisimen tapauksessa.
- Komento "JOKA RIVI" määrittää RIV-tason liipaisimen.
- WHEN-lausekkeessa määritetään lisäehto, jossa laukaisimen on aktivoitava.
- Ilmoitusosa, suoritusosa, poikkeuksen käsittelyosa on sama kuin muiden PL / SQL-lohkojen. Ilmoitusosa ja poikkeusten käsittelyosa ovat valinnaisia.
: UUSI ja: VANHA lauseke
Rivitason liipaisimessa liipaisin käynnistyy jokaiselle liittyvälle riville. Ja joskus vaaditaan tieto arvosta ennen DML-käskyä ja sen jälkeen.
Oracle on toimittanut kaksi lauseketta RECORD-tason liipaisimeen näiden arvojen pitämiseksi. Voimme käyttää näitä lausekkeita viittaamaan vanhoihin ja uusiin arvoihin liipaisimen rungon sisällä.
- : UUSI - Se pitää uuden arvon perustaulukon / näkymän sarakkeissa liipaisun suorituksen aikana
- : VANHA - Siinä on perustaulukon / näkymän sarakkeiden vanha arvo liipaisun suorituksen aikana
Tätä lauseketta tulisi käyttää DML-tapahtuman perusteella. Alla olevassa taulukossa määritetään, mikä lauseke on voimassa mille DML-käskylle (INSERT / UPDATE / DELETE).
LISÄÄ | PÄIVITTÄÄ | POISTAA | |
:UUSI | PÄTEVÄ | PÄTEVÄ | VOIMATON. Poistotapauksessa ei ole uutta arvoa. |
:VANHA | VIRHEELLINEN. Lisätapauksessa ei ole vanhaa arvoa | PÄTEVÄ | PÄTEVÄ |
Liipaisun sijasta
"INSTEAD OF trigger" 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 kolmesta perustaulusta. Kun mitä tahansa DML-tapahtumaa annetaan tämän näkymän yli, se mitätöityy, koska tiedot otetaan kolmesta eri taulukosta. Joten tässä käytetään liipaisimen INSTEAD. INSTEAD OF -liipaisinta käytetään muokkaamaan perustaulukoita suoraan sen sijaan, että muokkaat tietyn tapahtuman näkymää.
Esimerkki 1 : Tässä esimerkissä aiomme luoda monimutkaisen näkymän kahdesta pohjataulukosta.
- Taulukko_1 on emp taulukko ja
- Taulukko_2 on osastotaulukko.
Sitten aiomme nähdä, kuinka INSTEAD OF -liipaisinta käytetään päivittämään sijaintitiedot käsky tässä monimutkaisessa näkymässä. Aiomme myös nähdä, kuinka: NEW ja: OLD on hyödyllinen laukaisimissa.
- Vaihe 1: Luodaan taulukot 'emp' ja 'dept' sopivilla sarakkeilla
- Vaihe 2: Taulukon täyttäminen näytearvoilla
- Vaihe 3: Luodaan näkymä yllä luotua taulukkoa varten
- Vaihe 4: Näkymän päivitys ennen liipaisun sijasta
- Vaihe 5: Liipaisimen sijasta luominen
- Vaihe 6: Näkymän päivitys liipaisun sijasta
Vaihe 1) Luodaan taulukot 'emp' ja 'dept' sopivilla 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));/
Koodin selitys
- Koodirivi 1-7 : Taulukon 'emp' luominen.
- Koodirivi 8-12 : Taulukon osaston luominen.
Tuotos
Taulukko luotu
Vaihe 2) Nyt kun olemme luoneet taulukon, täytetään tämä taulukko näyte-arvoilla ja Luoma näkymiä yllä oleville taulukoille.
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;/
Koodin selitys
- Koodirivi 13-19 : Lisätään tietoja osastotaulukkoon.
- Koodirivi 20-26: Lisätään tietoja emp-taulukkoon.
Tuotos
PL / SQL-menettely on suoritettu
Vaihe 3) Näkymän luominen yllä luotua taulukkoa varten.
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;
Koodin selitys
- Koodirivi 27-32: Guru99_emp_view-näkymän luominen.
- Koodirivi 33: Kysely guru99_emp_view.
Tuotos
Näkymä luotu
TYÖNTEKIJÄN NIMI | DEPT_NAME | SIJAINTI |
ZZZ | HR | USA |
YYY | MYYNTI | Iso-Britannia |
XXX | RAHOITUS | JAPANI |
Vaihe 4) Näkymän päivitys ennen liipaisun sijasta.
BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name=:'XXX’;COMMIT;END;/
Koodin selitys
- Koodirivi 34-38: Päivitä "XXX" -sijainniksi "FRANCE". Se nosti poikkeuksen, koska DML-lausunnot eivät ole sallittuja monimutkaisessa näkymässä.
Tuotos
ORA-01779: ei voi muokata saraketta, joka kartoitetaan avainta säilyttämättömään taulukkoon
ORA-06512: rivillä 2
Vaihe 5) Välttääksemme virheitä edellisen vaiheen näkymän päivityksen aikana, tässä vaiheessa aiomme käyttää "laukaisimen sijaan".
CREATE TRIGGER guru99_view_modify_trgINSTEAD OF UPDATEON guru99_emp_viewFOR EACH ROWBEGINUPDATE deptSET location=:new.locationWHERE dept_name=:old.dept_name;END;/
Koodin selitys
- Koodirivi 39: INSTEAD OF -liipaisimen luominen UPDATE-tapahtumalle guru99_emp_view-näkymässä ROW-tasolla. Se sisältää päivityslausekkeen, jolla päivitetään sijainti perustaulukossa "osasto".
- Koodirivi 44: Päivityslauseke käyttää ': NEW' ja ': OLD' etsimään sarakkeiden arvon ennen päivitystä ja sen jälkeen.
Tuotos
Liipaisin luotu
Vaihe 6) Näkymän päivitys liipaisun sijasta. Nyt virhe ei tule, koska "liipaisimen sijaan" hoitaa tämän monimutkaisen näkymän päivitystoiminnon. Ja kun koodi on suoritettu, työntekijän XXX sijainti päivitetään "Ranskalle" Japanista.
BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX';COMMIT;END;/
SELECT * FROM guru99_emp_view;
Koodin selitys:
- Koodirivi 49-53: XXX : n sijainnin päivitys FRANCE: ksi. Se on onnistunut, koska INSTEAD OF -liipaisin on pysäyttänyt varsinaisen päivityslausunnon näkymässä ja suorittanut perustaulukon päivityksen.
- Koodirivi 55: Päivitetyn tietueen tarkistaminen.
Tuotos:
PL / SQL-menettely on suoritettu onnistuneesti
TYÖNTEKIJÄN NIMI | DEPT_NAME | SIJAINTI |
ZZZ | HR | USA |
YYY | MYYNTI | Iso-Britannia |
XXX | RAHOITUS | RANSKA |
Yhdisteen liipaisin
Yhdistetty liipaisin on liipaisin, jonka avulla voit määrittää toiminnot kullekin yhdelle liipaisimen rungon neljälle ajoituspisteelle. Sen tukemat neljä erilaista ajoituspistettä ovat alla.
- ENNEN LAUSUMAA - taso
- ENNEN RIVIä - taso
- RIVIN JÄLKEEN - taso
- JULKISUUDEN JÄLKEEN - taso
Se tarjoaa mahdollisuuden yhdistää eri ajoituksen toiminnot samaan liipaisimeen.
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;
Syntaksi Selitys:
- Yllä oleva syntakse osoittaa 'COMPOUND' -liipaisimen luomisen.
- Deklaratiivinen osa on yhteinen kaikille laukaisurungon suorituslohkoille.
- Nämä 4 ajoituslohkoa voivat olla missä tahansa järjestyksessä. Kaikkia näitä 4 ajoituslohkoa ei ole pakollinen. Voimme luoda YHDISTETTY-liipaisimen vain tarvittaville ajoituksille.
Esimerkki 1 : Tässä esimerkissä aiomme luoda laukaisimen, jonka avulla palkkasarake täytetään automaattisesti oletusarvolla 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;
Koodin selitys:
- Koodirivi 2-10 : Yhdistetyn liipaisimen luominen. Se on luotu ajoitukseen ENNEN RIVI-tasoa täyttämään palkan oletusarvo 5000. Tämä muuttaa palkan oletusarvoksi '5000' ennen tietueen lisäämistä taulukkoon.
- Koodirivi 11-14 : Lisää tietue emp -taulukkoon.
- Koodirivi 16 : Lisätyn tietueen tarkistus.
Tuotos:
Trigger luotu
PL / SQL-menettely on suoritettu onnistuneesti.
EMP_NAME | EMP_NO | PALKKA | JOHTAJA | DEPT_NO |
CCC | 1004 | 5000 | AAA | 30 |
Triggerien ottaminen käyttöön ja poistaminen käytöstä
Triggerit voidaan ottaa käyttöön tai poistaa käytöstä. Liipaisimen käyttöön ottamiseksi 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 sallimiseksi / käytöstä poistamiseksi.
ALTER TRIGGER[ENABLE|DISABLE];ALTER TABLE [ENABLE|DISABLE] ALL TRIGGERS;
Syntaksi Selitys:
- Ensimmäisessä syntaksissa kerrotaan, kuinka yksittäinen liipaisin otetaan käyttöön / pois käytöstä.
- Toinen lausunto näyttää, kuinka kaikki tietyn taulukon laukaisimet otetaan käyttöön / pois käytöstä.
Yhteenveto
Tässä luvussa olemme oppineet PL / SQL-laukaisimista ja niiden eduista. Olemme myös oppineet eri luokitukset ja keskustelleet liipaisimen ja yhdisteen liipaisimen sijasta.