I stedet for, forbindelse [eksempel]

Hvad er Trigger i PL/kvm?

udløsere er lagrede programmer, der automatisk fyres af Oracle engine, når DML-udsagn som insert, update, delete udføres på bordet, eller der opstår nogle begivenheder. Koden, der skal udelukkes i tilfælde af en udløser, kan defineres i henhold til kravet. Du kan vælge den begivenhed, hvorpå udløseren skal fyres, og tidspunktet for udførelsen. Formålet med trigger er at opretholde integriteten af oplysninger om databasen.

i denne tutorial lærer du –

  • fordele ved triggere
  • typer af triggere i Oracle
  • Sådan oprettes Trigger
  • : ny og :gammel Klausul
  • i stedet for Trigger
  • sammensat Trigger

fordele ved triggere

Følgende er fordelene ved triggere.

  • generering af nogle afledte kolonneværdier automatisk
  • håndhævelse af referentiel integritet
  • Hændelseslogning og lagring af oplysninger om tabeladgang
  • revision
  • synkron replikation af tabeller
  • indførelse af sikkerhedsgodkendelser
  • forebyggelse af ugyldige transaktioner

typer af udløsere i Oracle

udløsere kan klassificeres ud fra følgende parametre.

  • klassificering baseret på timingen
    • før Trigger: den skyder, før den angivne begivenhed er indtruffet.
    • efter Trigger: det affyrer efter den angivne begivenhed er indtruffet.
    • i stedet for Trigger: en speciel type. Du vil lære mere om de yderligere emner. (kun for DML )
  • klassificering baseret på niveauet
    • Statement Level Trigger: det affyrer en gang for den angivne hændelseserklæring.
    • række niveau Trigger: det brande for hver post, der fik påvirket i den angivne begivenhed. (kun for DML)
  • klassificering baseret på begivenheden
    • DML-Trigger: den udløses, når DML-begivenheden er specificeret (indsæt / opdater / slet)
    • DDL-Trigger: Det fyrer, når DDL-begivenheden er angivet (Opret/ALTER)
    • DATABASE Trigger: det fyrer, når databasehændelsen er angivet (LOGON/LOGOFF/opstart/nedlukning)

så hver trigger er kombinationen af ovenstående parametre.

Sådan oprettes Trigger

nedenfor er syntaksen til oprettelse af en trigger.

udløsere i PL/div

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

Syntaksforklaring:

  • ovenstående syntaks viser de forskellige valgfrie udsagn, der er til stede i trigger skabelse.
  • før / efter angiver begivenhedstimingerne.
  • indsæt / Opdater/LOGON/Opret / etc. vil angive den begivenhed, for hvilken udløseren skal fyres.
  • on klausul vil angive på hvilket objekt ovennævnte begivenhed er gyldig. For eksempel vil dette være tabelnavnet, som DML-begivenheden kan forekomme i tilfælde af DML-Trigger.
  • kommandoen “for hver række” angiver triggeren til rækkeniveau.
  • når klausul angiver den yderligere betingelse, hvor udløseren skal affyre.
  • deklarationsdelen, udførelsesdelen, undtagelseshåndteringsdelen er den samme som for de andre pl / kvm-blokke. Deklarationsdel og undtagelseshåndteringsdel er valgfri.

:ny og :gammel Klausul

i en række niveau trigger, udløser brande for hver relateret række. Og nogle gange er det nødvendigt at kende værdien før og efter DML-erklæringen.

Oracle har leveret to klausuler i triggeren på rekordniveau for at holde disse værdier. Vi kan bruge disse klausuler til at henvise til de gamle og nye værdier inde i udløserlegemet.

  • :Ny – den har en ny værdi for kolonnerne i basistabellen/visningen under udløserudførelsen
  • :gammel – den har Gammel værdi af kolonnerne i basistabellen/visningen under udløserudførelsen

denne klausul skal bruges baseret på DML-begivenheden. Nedenstående tabel angiver, hvilken klausul der er gyldig for hvilken DML-erklæring (indsæt/opdater/slet).

indsæt Opdater slet
: ny gyldig ugyldig. Der er ingen ny værdi i Slet sag.
:Gammel ugyldig. Der er ingen Gammel værdi i Indsæt sag gyldig gyldig

i stedet for Trigger

“i stedet for trigger” er den specielle type trigger. Det bruges kun i DML triggere. Det bruges, når en DML begivenhed vil forekomme på den komplekse visning.

overvej et eksempel, hvor en visning er lavet af 3 basetabeller. Når en DML-begivenhed udstedes over denne visning, bliver den ugyldig, fordi dataene er taget fra 3 forskellige tabeller. Så i dette i stedet for trigger bruges. I stedet for trigger bruges til at ændre basetabellerne direkte i stedet for at ændre visningen for den givne begivenhed.

eksempel 1: i dette eksempel skal vi oprette en kompleks visning fra to basistabeller.

  • Table_1 er emp-tabel og
  • Table_2 er afdelingstabel.

så skal vi se, hvordan i stedet for trigger bruges til at udstede opdatering af placeringsdetaljeerklæringen på denne komplekse visning. Vi vil også se, hvordan :nyt og :gammelt er nyttigt i udløsere.

  • Trin 1: Oprettelse af tabel ’emp’ og ‘dept’ med passende kolonner
  • Trin 2: udfyldning af tabellen med prøveværdier
  • Trin 3: Oprettelse af visning for ovenstående oprettede tabel
  • Trin 4: Opdatering af visning før i stedet-af trigger
  • Trin 5: Oprettelse af i stedet-af trigger
  • Trin 6: opdatering af visning efter i stedet-af trigger

Trin 1) Oprettelse af tabel ’emp’ og ‘Dept’ med passende kolonner

udløser i PL/div

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

Kodeforklaring

  • kodelinie 1-7: Tabel’ emp ‘ skabelse.
  • kode linje 8-12: tabel ‘dept’ skabelse.

Output

tabel oprettet

Trin 2) Nu, da vi har oprettet tabellen, udfylder vi denne tabel med prøveværdier og oprettelse af visninger for ovenstående tabeller.

udløser i PL/div

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

Kodeforklaring

  • kodelinie 13-19: indsættelse af data i ‘dept’ tabel.
  • kodelinje 20-26: indsættelse af data i’ emp ‘ – tabellen.

Output

pl/KVL procedure afsluttet

Trin 3) Oprettelse af en visning for ovenstående oprettede tabel.

udløsere i PL/pl

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;

Kodeforklaring

  • kodelinie 27-32: oprettelse af ‘guru99_emp_visning’ visning.
  • kode linje 33: forespørgsel guru99_emp_visning.

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’. Det rejste undtagelsen, fordi DML-udsagnene ikke er tilladt i den komplekse opfattelse.

Output

ORA-01779: kan ikke ændre en kolonne, der kortlægges til en ikke-nøglebeskyttet tabel

ORA-06512: på linje 2

Trin 5)for at undgå fejlmødet under opdateringsvisning i det foregående trin, i dette trin skal vi bruge “i stedet for trigger.”

udløser i PL/div

CREATE TRIGGER guru99_view_modify_trgINSTEAD OF UPDATEON guru99_emp_viewFOR EACH ROWBEGINUPDATE deptSET location=:new.locationWHERE dept_name=:old.dept_name;END;/

Kodeforklaring

  • kodelinie 39: Oprettelse af i stedet for trigger for ‘opdatering’ begivenhed på’ guru99_emp_visning ‘ visning på rækken niveau. Den indeholder opdateringserklæringen for at opdatere placeringen i basistabellen ‘dept’.
  • kodelinje 44:Opdateringserklæring bruger’: ny’ og’: gammel’ til at finde værdien af kolonner før og efter opdateringen.

Output

Trigger oprettet

Trin 6) opdatering af visning efter i stedet for trigger. Nu kommer fejlen ikke, da “i stedet for trigger” håndterer opdateringsoperationen af denne komplekse visning. Og når koden har udført placeringen af medarbejder … vil blive opdateret til” Frankrig “fra” Japan.”

udløser i PL/pl

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

Kodeforklaring:

  • kodelinie 49-53: opdatering af placeringen af “” til ‘Frankrig’. Det er vellykket, fordi udløseren ‘i stedet for’ har stoppet den faktiske opdateringserklæring i visningen og udført basetabelopdateringen.
  • kodelinje 55: bekræftelse af den opdaterede post.

udgang:

pl/pl procedure fuldført

EMPLOYEE_NAME DEPT_NAME placering
HR placering
HR /td> USA
ååå salg
financial Frankrig

sammensat trigger

sammensat trigger er en trigger, der giver dig mulighed for at specificere handlinger for hvert af fire timingpunkter i det enkelte triggerlegeme. De fire forskellige timing punkt Det understøtter er som nedenfor.

  • før sætning – niveau
  • før række – niveau
  • efter række – niveau
  • efter sætning – niveau

det giver mulighed for at kombinere handlingerne for forskellige timing i den samme trigger.

udløsere i PL/div

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;

Syntaksforklaring:

  • ovenstående syntaks viser oprettelsen af ‘forbindelse’ trigger.
  • deklarativ sektion er almindelig for hele udførelsesblokken i udløserlegemet.
  • disse 4 timingblokke kan være i en hvilken som helst rækkefølge. Det er ikke obligatorisk at have alle disse 4 timingblokke. Vi kan kun oprette en sammensat trigger til de tidspunkter, der kræves.

eksempel 1: i dette eksempel skal vi oprette en trigger til automatisk at udfylde lønkolonnen med standardværdien 5000.

udløsere i PL/div

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;

kodeforklaring:

  • kodelinie 2-10: oprettelse af sammensat trigger. Det er oprettet til timing før rækkeniveau for at udfylde lønnen med standardværdi 5000. Dette ændrer lønnen til standardværdien ‘5000’, før posten indsættes i tabellen.
  • kodelinje 11-14: Indsæt posten i’ emp ‘ – tabellen.
  • kodelinje 16: bekræftelse af den indsatte post.

Output:

Trigger oprettet

pl / KVL procedure fuldført.

EMP_NAME EMP_NO løn MANAGER DEPT_NO
CCC 1004 5000 AAA 30

aktivering og deaktivering af udløsere

udløsere kan aktiveres eller deaktiveres. For at aktivere eller deaktivere udløseren skal der gives en ALTER (DDL) – erklæring for udløseren, der deaktiverer eller aktiverer den.

nedenfor er syntaksen for aktivering / deaktivering af udløserne.

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

Syntaksforklaring:

  • den første syntaks viser, hvordan du aktiverer / deaktiverer den enkelte trigger.
  • den anden sætning viser, hvordan du aktiverer/deaktiverer alle udløsere på en bestemt tabel.

sammendrag

i dette kapitel har vi lært om PL / kvm triggere og deres fordele. Vi har også lært de forskellige klassifikationer og diskuteret i stedet for trigger og sammensat trigger.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *