Oracle PL/SQL Trigger Tutorial: sen sijaan, yhdiste [esimerkki]

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)
  • tapahtuman perusteella
    • 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.

    Triggers in PL/SQL

    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

    triggers in PL/SQL

    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.

    Triggers in PL/SQL

    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.

    Triggers in PL/SQL

    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.

    Triggers in PL/SQL

    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.”

    Triggers in PL/SQL

    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.”

    Triggers in PL/SQL

    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

    td> USA

    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.

    Triggers in PL/SQL

    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.

    Triggers in PL/SQL

    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.

    004

    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.

    Vastaa

    Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *