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