Hva er utløser i PL / SQL?
TRIGGERS er lagrede programmer som blir sparket av Oracle-motor automatisk når DML-utsagn som innsetting, oppdatering, sletting kjøres på bordet eller noen hendelser inntreffer. Koden som skal utføres i tilfelle en utløser kan defineres i henhold til kravet. Du kan velge hendelsen som utløseren må avfyres på og tidspunktet for utførelsen. Hensikten med trigger er å opprettholde integriteten til informasjonen i databasen.
I denne veiledningen vil du lære-
- Fordeler med utløsere
- Typer av utløsere i Oracle
- Hvordan lage utløser
- : NY og: GAMLE Klausul
- I stedet for utløser
- Sammensatt utløser
Fordeler med utløsere
Følgende er fordelene med utløsere.
- Genererer noen avledede kolonneverdier automatisk
- Håndheve referanseintegritet
- Hendelseslogging og lagring av informasjon om tilgang til bord
- Revisjon
- Synkron replikering av tabeller
- Pålegge sikkerhetstillatelser
- Forebygge ugyldige transaksjoner
Typer av utløsere i Oracle
Utløsere kan klassifiseres basert på følgende parametere.
- Klassifisering basert på tidspunktet
- FØR utløseren: Den utløses før den spesifiserte hendelsen har skjedd.
- ETTER utløser: Den utløses etter at den angitte hendelsen har skjedd.
- I stedet for utløser: En spesiell type. Du vil lære mer om de videre emnene. (bare for DML)
- Klassifisering basert på nivå
- UTTALELSE nivå Utløser: Den utløses en gang for den angitte hendelseserklæringen.
- ROW-nivå utløser: Den utløses for hver post som ble berørt i den angitte hendelsen. (bare for DML)
- Klassifisering basert på arrangementet
- DML-utløser: Den utløses når DML-hendelsen er spesifisert (INSERT / UPDATE / DELETE)
- DDL-utløser: Den utløses når DDL-hendelsen er spesifisert (CREATE / ALTER)
- DATABASE-utløser: Den utløses når databasehendelsen er spesifisert (LOGON / LOGOFF / STARTUP / SHUTDOWN)
Så hver trigger er kombinasjonen av parametrene ovenfor.
Hvordan lage utløser
Nedenfor er syntaksen for å lage en utløser.
CREATE [ OR REPLACE ] TRIGGER[BEFORE | AFTER | INSTEAD OF ][INSERT | UPDATE | DELETE… ]ON [FOR EACH ROW][WHEN ]DECLARE BEGIN EXCEPTION END;
Syntaks Forklaring:
- Ovennevnte syntaks viser de forskjellige valgfrie setningene som er tilstede i utløseren.
- FØR / ETTER vil spesifisere tidspunktet for hendelsen.
- INSERT / UPDATE / LOGON / CREATE / etc. vil spesifisere hendelsen som utløseren må utløses for.
- ON-ledd vil spesifisere hvilket objekt ovennevnte hendelse er gyldig. For eksempel vil dette være tabellnavnet som DML-hendelsen kan forekomme i tilfelle DML Trigger.
- Kommandoen "FOR HVER RAD" vil spesifisere ROW-nivåutløseren.
- NÅR klausul vil spesifisere tilleggstilstanden der utløseren må utløses.
- Deklarasjonsdelen, utførelsesdel, unntakshåndteringsdel er den samme som de andre PL / SQL-blokkene. Deklarasjonsdel og unntakshåndteringsdel er valgfri.
: NY og: GAMLE Klausul
I en radnivåutløser utløses utløseren for hver relatert rad. Noen ganger kreves det å vite verdien før og etter DML-setningen.
Oracle har gitt to ledd i RECORD-nivåutløseren for å holde disse verdiene. Vi kan bruke disse leddene til å referere til de gamle og nye verdiene inne i utløserkroppen.
- : NYTT - Den inneholder en ny verdi for kolonnene i basistabellen / visningen under utførelsen av utløseren
- : GAMLE - Den har gammel verdi av kolonnene i basistabellen / visningen under utførelsen av utløseren
Denne paragrafen bør brukes basert på DML-hendelsen. Tabellen nedenfor vil spesifisere hvilken paragraf som er gyldig for hvilken DML-setning (INSERT / UPDATE / DELETE).
SETT INN | OPPDATER | SLETT | |
:NY | GYLDIG | GYLDIG | UGYLDIG. Det er ingen ny verdi i slettingssaken. |
:GAMMEL | UGYLDIG. Det er ingen gammel verdi i innleggssaken | GYLDIG | GYLDIG |
I stedet for utløser
"INSTEAD OF trigger" er den spesielle typen trigger. Den brukes bare i DML-utløsere. Den brukes når en DML-hendelse skal skje i den komplekse visningen.
Tenk på et eksempel der en visning er laget av tre basistabeller. Når en DML-hendelse blir utstedt over denne visningen, blir den ugyldig fordi dataene er hentet fra 3 forskjellige tabeller. Så i denne INSTEAD OF trigger brukes. INSTEAD OF-utløseren brukes til å modifisere basistabellene direkte i stedet for å endre visningen for den gitte hendelsen.
Eksempel 1 : I dette eksemplet skal vi lage en kompleks visning fra to basistabeller.
- Table_1 er emp-tabell og
- Table_2 er avdelingstabell.
Deretter skal vi se hvordan INSTEAD OF-utløseren brukes til å utstede OPPDATERING detaljinformasjonen om denne komplekse visningen. Vi skal også se hvordan: NEW og: OLD er nyttig i utløsere.
- Trinn 1: Opprette tabell 'emp' og 'dept' med passende kolonner
- Trinn 2: Fyll ut tabellen med prøveverdier
- Trinn 3: Opprette visning for tabellen ovenfor
- Trinn 4: Oppdater visningen før i stedet for utløseren
- Trinn 5: Opprettelse av stedet for trigger
- Trinn 6: Oppdater visningen etter i stedet for utløseren
Trinn 1) Opprette tabell '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));/
Kode Forklaring
- Kodelinje 1-7 : Opprettelse av tabell 'emp'.
- Kodelinje 8-12 : Oppretting av tabell 'avd.'
Produksjon
Tabell opprettet
Trinn 2) Nå siden vi har opprettet tabellen, vil vi fylle ut denne tabellen med eksempelverdier og opprette visninger for tabellene ovenfor.
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;/
Kode Forklaring
- Kodelinje 13-19 : Sette inn data i 'dept' tabellen.
- Kodelinje 20-26: Sette inn data i 'emp' tabellen.
Produksjon
PL / SQL-prosedyre fullført
Trinn 3) Opprette en visning for tabellen som er opprettet ovenfor.
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;
Kode Forklaring
- Kodelinje 27-32: Oppretting av visningen 'guru99_emp_view'.
- Kodelinje 33: Spørring av guru99_emp_view.
Produksjon
Visning opprettet
ARBEIDSTAKERS NAVN | DEPT_NAME | PLASSERING |
ZZZ | HR | USA |
ÅÅÅ | SALG | Storbritannia |
XXX | FINANSIELL | JAPAN |
Trinn 4) Oppdater visningen før i stedet for utløseren.
BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name=:'XXX’;COMMIT;END;/
Kode Forklaring
- Kodelinje 34-38: Oppdater plasseringen til "XXX" til 'FRANCE'. Det hevet unntaket fordi DML-uttalelsene ikke er tillatt i den komplekse visningen.
Produksjon
ORA-01779: kan ikke endre en kolonne som tilordnes til en ikke-nøkkelbevart tabell
ORA-06512: på linje 2
Trinn 5) For å unngå feilmeldingen under oppdateringsvisningen i forrige trinn, skal vi i dette trinnet bruke "i stedet for utløser".
CREATE TRIGGER guru99_view_modify_trgINSTEAD OF UPDATEON guru99_emp_viewFOR EACH ROWBEGINUPDATE deptSET location=:new.locationWHERE dept_name=:old.dept_name;END;/
Kode Forklaring
- Kodelinje 39: Oppretting av INSTEAD OF trigger for 'UPDATE' hendelse i 'guru99_emp_view' visningen på ROW-nivå. Den inneholder oppdateringserklæringen for å oppdatere plasseringen i basistabellen 'avd.'.
- Kodelinje 44: Oppdateringserklæring bruker ': NEW' og ': OLD' for å finne verdien av kolonnene før og etter oppdateringen.
Produksjon
Utløser opprettet
Trinn 6) Oppdater visningen etter i stedet for utløseren. Nå kommer ikke feilen da "i stedet for utløser" vil håndtere oppdateringen av denne komplekse visningen. Og når koden har utført, vil lokasjonen til ansatt XXX bli oppdatert til "Frankrike" fra "Japan."
BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX';COMMIT;END;/
SELECT * FROM guru99_emp_view;
Kode Forklaring:
- Kodelinje 49-53: Oppdatering av plasseringen av "XXX" til 'FRANCE'. Det er vellykket fordi 'INSTEAD OF' -utløseren har stoppet den faktiske oppdateringserklæringen på visningen og utført oppdateringen av basistabellen.
- Kodelinje 55: Verifisere den oppdaterte posten.
Produksjon:
PL / SQL-prosedyre fullført
ARBEIDSTAKERS NAVN | DEPT_NAME | PLASSERING |
ZZZ | HR | USA |
ÅÅÅ | SALG | Storbritannia |
XXX | FINANSIELL | FRANKRIKE |
Sammensatt utløser
Den sammensatte utløseren er en utløser som lar deg spesifisere handlinger for hvert av de fire timingpunktene i den eneste utløserkroppen. De fire forskjellige tidspunktene den støtter er som nedenfor.
- FØR UTTALELSE - nivå
- FØR RAD - nivå
- ETTER RAD - nivå
- ETTER UTTALELSE - nivå
Det gir muligheten til å kombinere handlingene for forskjellig timing i samme trigger.
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;
Syntaks Forklaring:
- Ovennevnte syntaks viser etableringen av 'COMPOUND' -utløseren.
- Deklarativ seksjon er vanlig for all utførelsesblokk i utløserhuset.
- Disse 4 timingblokkene kan være i hvilken som helst sekvens. Det er ikke obligatorisk å ha alle disse 4 timingblokkene. Vi kan bare opprette en COMPOUND-utløser for de nødvendige tidspunktene.
Eksempel 1 : I dette eksemplet skal vi lage en utløser for automatisk å fylle ut lønnskolonnen med standardverdien 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;
Kode Forklaring:
- Kodelinje 2-10 : Opprettelse av sammensatt utløser. Den er opprettet for timing FØR RAD-nivå for å fylle ut lønnen med standardverdien 5000. Dette vil endre lønnen til standardverdien '5000' før du legger inn posten i tabellen.
- Kodelinje 11-14 : Sett inn posten i 'emp' tabellen.
- Kodelinje 16 : Verifisere den innsatte posten.
Produksjon:
Utløser opprettet
PL / SQL-prosedyre fullført.
EMP_NAME | EMP_NO | LØNN | SJEF | DEPT_NO |
CCC | 1004 | 5000 | AAA | 30 |
Aktivere og deaktivere utløsere
Utløsere kan aktiveres eller deaktiveres. For å aktivere eller deaktivere utløseren, må det gis en ALTER (DDL) uttalelse for utløseren som deaktiverer eller aktiverer den.
Nedenfor er syntaksen for aktivering / deaktivering av utløserne.
ALTER TRIGGER[ENABLE|DISABLE];ALTER TABLE [ENABLE|DISABLE] ALL TRIGGERS;
Syntaks Forklaring:
- Den første syntaksen viser hvordan du aktiverer / deaktiverer enkeltutløseren.
- Den andre setningen viser hvordan du aktiverer / deaktiverer alle utløserne på et bestemt bord.
Sammendrag
I dette kapittelet har vi lært om PL / SQL-utløsere og fordelene deres. Vi har også lært de forskjellige klassifiseringene og diskutert INSTEAD OF trigger og COMPOUND trigger.