Oracle PL/SQL Trigger Tutorial: in plaats van Compound [voorbeeld]

Wat is Trigger in PL / SQL?

TRIGGERS zijn opgeslagen programma ‘ s die automatisch worden gestart door Oracle engine wanneer DML-Statements zoals invoegen, bijwerken, verwijderen op de tabel worden uitgevoerd of sommige gebeurtenissen zich voordoen. De code die moet worden excecuted in geval van een trigger kan worden gedefinieerd volgens de eis. U kunt de gebeurtenis kiezen waarop de trigger moet worden afgevuurd en de timing van de uitvoering. Het doel van trigger is om de integriteit van de informatie in de database te behouden.

In deze tutorial leert u –

  • voordelen van Triggers
  • soorten Triggers in Oracle
  • Hoe Trigger
  • te maken:nieuwe en :oude Clausule
  • in plaats van Trigger
  • samengestelde Trigger

voordelen van Triggers

Hieronder volgen de voordelen van triggers.

  • het Genereren van een aantal afgeleide kolom waarden automatisch
  • het Afdwingen van referentiële integriteit
  • Event logging en het opslaan van gegevens op tafel access
  • Audit
  • Synchrone replicatie van tabellen
  • het Opleggen van veiligheid machtigingen
  • het Voorkomen van ongeldige transacties

Soorten Triggers in Oracle

Triggers kunnen worden ingedeeld op basis van de volgende parameters.

  • classificatie gebaseerd op de timing
    • vóór Trigger: het vuurt voordat de opgegeven gebeurtenis heeft plaatsgevonden.
    • na Trigger: Het start nadat de opgegeven gebeurtenis heeft plaatsgevonden.
    • in plaats van Trigger: een speciaal type. U zult meer te weten komen over de verdere onderwerpen. (alleen voor DML )
  • classificatie gebaseerd op de level
    • STATEMENT Level Trigger: het vuurt één keer voor het opgegeven event statement.
    • row level Trigger: het vuurt voor elk record dat werd beïnvloed in de opgegeven gebeurtenis. (alleen voor DML)
  • classificatie gebaseerd op de gebeurtenis
    • DDL-Trigger: het Start wanneer de DML-gebeurtenis is opgegeven (invoegen/bijwerken/verwijderen)
    • DDL-Trigger: Het vuurt als de DDL-gebeurtenis is opgegeven (CREATE/ALTER)
    • DATABASE-Trigger: het vuurt als de database-gebeurtenis is opgegeven (LOGON/LOGOFF/STARTUP/SHUTDOWN)

dus elke trigger is de combinatie van bovenstaande parameters.

Trigger aanmaken

Hieronder is de syntaxis voor het maken van een trigger.

Triggers in PL/SQL

CREATE TRIGGER <trigger_name> ON<name of underlying object> DECLARE<Declaration part>BEGIN<Execution part> EXCEPTION<Exception handling part> END;

  • Voor / Na zal de gebeurtenistijden specificeren.
  • INSERT/UPDATE / LOGON / CREATE / etc. specificeert de gebeurtenis waarvoor de trigger moet worden afgevuurd.
  • on-clausule geeft aan op welk object de bovengenoemde gebeurtenis geldig is. Dit zal bijvoorbeeld de tabelnaam zijn waarop de DML-gebeurtenis zich kan voordoen in het geval van DML-Trigger.
  • Commando “voor elke rij” specificeert de trigger op rijniveau.
  • wanneer clausule zal de aanvullende voorwaarde specificeren waarin de trigger moet vuren.
  • het declaratiegedeelte, uitvoergedeelte, exception handlinggedeelte is hetzelfde als dat van de andere PL / SQL-blokken. Declaratie deel en uitzondering behandeling deel zijn optioneel.
  • : nieuwe en: oude Clausule

    In een trigger op rijniveau, de triggervuren voor elke gerelateerde rij. En soms is het nodig om de waarde te weten voor en na de DML statement.

    Oracle heeft twee clausules gegeven in de trigger op recordniveau om deze waarden vast te houden. We kunnen deze clausules gebruiken om te verwijzen naar de oude en nieuwe waarden binnen het trigger lichaam.

    • :Nieuw-het bevat een nieuwe waarde voor de kolommen van de basistabel/weergave tijdens de trigger-uitvoering
    • : oud-het bevat de Oude waarde van de kolommen van de basistabel/weergave tijdens de trigger-uitvoering

    deze clausule moet worden gebruikt op basis van de DML-gebeurtenis. Onderstaande tabel geeft aan welke clausule geldig is voor welke DML-verklaring (invoegen/bijwerken/verwijderen).

    INSERT UPDATE DELETE
    : NEW VALID VALID ongeldig. Er is geen nieuwe waarde in geval verwijderen.
    :Oude ongeldig. Er is geen oude waarde in insert case VALID

    in plaats van Trigger

    ” in plaats van trigger ” is het speciale type trigger. Het wordt alleen gebruikt in DML-triggers. Het wordt gebruikt wanneer een DML-gebeurtenis gaat plaatsvinden op de complexe weergave.

    beschouw een voorbeeld waarin een weergave wordt gemaakt van 3 basistabellen. Wanneer een DML-gebeurtenis via deze weergave wordt uitgegeven, wordt dat ongeldig omdat de gegevens uit 3 verschillende tabellen zijn genomen. Dus in deze plaats van trigger wordt gebruikt. De trigger in plaats van trigger wordt gebruikt om de basistabellen direct te wijzigen in plaats van de weergave voor de gegeven gebeurtenis te wijzigen.

    Voorbeeld 1: In dit voorbeeld gaan we een complexe weergave maken van twee basistabel.

    • Table_1 is emp-tabel en
    • Table_2 is afdelingstabel.

    dan gaan we zien hoe de in plaats van trigger wordt gebruikt om het locatiedetail statement bij te werken in deze complexe weergave. We gaan ook kijken hoe het: nieuw en: oud nuttig is in triggers.

    • Stap 1: Tabel ‘emp’ en ‘dept’ aanmaken met de juiste kolommen
    • Stap 2: de tabel vullen met voorbeeldwaarden
    • Stap 3: weergave aanmaken voor de bovenstaande tabel
    • Stap 4: weergave bijwerken voor trigger
    • Stap 5: aanmaken van trigger
    • Stap 6: weergave bijwerken na trigger

    Stap 1) tabel ‘emp’ en ‘aanmaken Dept’ with appropriate Columns

    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));/

    codeuitleg

    • codelijn 1-7: Tabel ‘ emp ‘ creatie.
    • coderegel 8-12: tabel’ dept ‘ aanmaken.

    uitvoer

    tabel aangemaakt

    Stap 2) nu we de tabel hebben aangemaakt, zullen we deze tabel vullen met voorbeeldwaarden en weergaven voor de bovenstaande tabellen.

    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;/

    verklaring van de Code

    • Codelijn 13-19: gegevens in de dept-tabel invoegen.
    • coderegel 20-26: invoegen van gegevens in de’ emp ‘ – tabel.

    uitvoer

    pl/sql-procedure voltooid

    Stap 3) Een weergave maken voor de bovenstaande tabel.

    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;

    code verklaring

    • Codelijn 27-32: creatie van ‘guru99_emp_view’ weergave.
    • coderegel 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’. Het stelde de uitzondering, omdat de DML-verklaringen zijn niet toegestaan in de complexe visie.

    uitvoer

    ORA-01779: kan geen kolom wijzigen die toewijst aan een niet-sleutel-bewaarde tabel

    ORA-06512: op Regel 2

    Stap 5)om de fout te voorkomen tijdens het bijwerken van weergave in de vorige stap, gaan we in deze stap “gebruiken in plaats van trigger.”

    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;/

    code verklaring

    • Codelijn 39: Creatie van in plaats van trigger voor’ UPDATE ‘event op de’ guru99_emp_view ‘ weergave op rij niveau. Het bevat het update statement om de locatie in de basistabel ‘dept’bij te werken.
    • coderegel 44: Update statement gebruikt’: NEW ‘en’: OLD ‘ om de waarde van kolommen voor en na de update te vinden.

    uitvoer

    Trigger aangemaakt

    Stap 6) update van weergave na in plaats van trigger. Nu zal de fout niet komen als de “in plaats van trigger” zal de update operatie van deze complexe weergave af te handelen. En wanneer de code heeft uitgevoerd de locatie van werknemer XXX zal worden bijgewerkt naar “Frankrijk” van ” Japan.”

    Triggers in PL/SQL

    BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX'; COMMIT;END;/
    SELECT * FROM guru99_emp_view;

    verklaring van de Code:

    • Codelijn 49-53: Update van de locatie van “XXX” naar “Frankrijk”. Het is succesvol omdat de trigger ‘in plaats van’ het actuele updatestatement heeft gestopt en de basistabel-update heeft uitgevoerd.
    • coderegel 55: verificatie van de bijgewerkte record.

    uitvoer:

    PL/SQL-procedure met succes is voltooid

    EMPLOYEE_NAME DEPT_NAME PLAATS
    ZZZ ‘ UUR USA
    YYY VERKOOP verenigd koninkrijk
    XXX FINANCIAL FRANKRIJK

    Compound Trigger

    De Compound trigger is een trigger die je toestaat om op te geven welke acties voor elk van de vier timing punten in de single trigger lichaam. De vier verschillende timing punt Het ondersteunt is zoals hieronder.

    • Voor STATEMENT-niveau
    • voor rij-niveau
    • na rij – niveau
    • na STATEMENT – niveau

    Het biedt de mogelijkheid om de acties voor verschillende timing in dezelfde trigger te combineren.

    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;

    syntaxis uitleg:

    • bovenstaande syntaxis toont de creatie van ‘samengestelde’ trigger.
    • declaratieve sectie is gebruikelijk voor het gehele uitvoerblok in de trigger body.
    • Deze 4 timingblokken kunnen in elke volgorde staan. Het is niet verplicht om al deze 4 timingblokken te hebben. We kunnen een samengestelde trigger maken alleen voor de tijden die nodig zijn.

    Voorbeeld 1: in dit voorbeeld gaan we een trigger maken om de salariskolom automatisch te vullen met de standaardwaarde 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;

    Code verklaring:

    • codelijn 2-10: aanmaken van samengestelde Trigger. Het is gemaakt voor timing voor rij-niveau om het salaris te vullen met standaardwaarde 5000. Dit verandert het salaris in standaardwaarde ‘5000’ voordat het record in de tabel wordt ingevoegd.
    • coderegel 11-14: voeg de record in de ” emp ” – tabel in.
    • coderegel 16: verificatie van de ingevoegde record.

    uitvoer:

    Trigger aangemaakt

    PL / SQL procedure succesvol voltooid.

    EMP_NAME EMP_NO SALARIS BEHEER DEPT_NO
    CCC 1004 5000 AAA 30

    in-en Uitschakelen Triggers

    Hiermee kan worden ingeschakeld of uitgeschakeld. Om de trigger in of uit te schakelen, moet een ALTER (DDL) statement worden gegeven voor de trigger die hem uitschakelt of inschakelt.

    hieronder vindt u de syntaxis voor het in – /uitschakelen van de triggers.

    ALTER TRIGGER <trigger_name> ;ALTER TABLE <table_name> ALL TRIGGERS;

    syntaxis uitleg:

    • De eerste syntaxis laat zien hoe de enkele trigger in – / uitgeschakeld kan worden.
    • het tweede statement laat zien hoe alle triggers op een bepaalde tabel in – /uitgeschakeld kunnen worden.

    samenvatting

    In dit hoofdstuk hebben we geleerd over PL / SQL triggers en hun voordelen. We hebben ook geleerd van de verschillende classificaties en besproken in plaats van trigger en samengestelde trigger.

    Geef een antwoord

    Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *