Oracle PL/SQL-utløseropplæring: i stedet for sammensatt [eksempel]
Hva er Trigger i PL/SQL?
TRIGGERE er lagrede programmer som utløses av Oracle motor automatisk når DML-setninger som sett inn, oppdater, slett utfø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 der utløseren skal utløses og tidspunktet for utførelsen. Hensikten med trigger er å opprettholde integriteten til informasjonen i databasen.
Fordeler med triggere
Følgende er fordelene med triggere.
- Genererer noen avledede kolonneverdier automatisk
- Håndheve referensiell integritet
- Hendelseslogging og lagring av informasjon om bordtilgang
- Revisjon
- Synchronous replikering av tabeller
- Påtvinge sikkerhetsautorisasjoner
- Forhindrer ugyldige transaksjoner
Typer triggere i Oracle
Utløsere kan klassifiseres basert på følgende parametere.
- Klassifisering basert på timing
- FØR Trigger: Den utløses før den angitte hendelsen har skjedd.
- ETTER Trigger: Den utløses etter at den angitte hendelsen har skjedd.
- I STEDET FOR Trigger: En spesiell type. Du vil lære mer om de videre temaene. (kun for DML)
- Klassifisering basert på nivå
- STATEMENT nivå Trigger: Den utløses én gang for den angitte hendelsessetningen.
- ROW level Trigger: Den utløses for hver post som ble påvirket i den angitte hendelsen. (kun for DML)
- Klassifisering basert på Event
- DML Trigger: Den utløses når DML-hendelsen er spesifisert (INSERT/UPDATE/DELETE)
- DDL Trigger: Den utløses når DDL-hendelsen er spesifisert (CREATE/ALTER)
- DATABASE-utløser: Den utløses når databasehendelsen er spesifisert (LOGG PÅ/LOGG AV/STARTUP/SHUTDOWN)
Så hver trigger er kombinasjonen av parameterne ovenfor.
Hvordan lage trigger
Nedenfor er syntaksen for å lage en trigger.
CREATE [ OR REPLACE ] TRIGGER <trigger_name> [BEFORE | AFTER | INSTEAD OF ] [INSERT | UPDATE | DELETE......] ON<name of underlying object> [FOR EACH ROW] [WHEN<condition for trigger to get execute> ] DECLARE <Declaration part> BEGIN <Execution part> EXCEPTION <Exception handling part> END;
Syntaks forklaring:
- Syntaksen ovenfor viser de forskjellige valgfrie setningene som er til stede i utløseroppretting.
- FØR/ETTER vil spesifisere hendelsestidene.
- INSERT/UPDATE/LOGON/CREATE/etc. vil spesifisere hendelsen som utløseren må utløses for.
- ON-klausulen vil spesifisere på hvilket objekt den ovennevnte hendelsen er gyldig. For eksempel vil dette være tabellnavnet som DML-hendelsen kan oppstå på i tilfelle DML Trigger.
- Kommando "FOR HVER ROW" vil spesifisere ROW-nivåutløseren.
- WHEN-klausulen spesifiserer tilleggstilstanden der utløseren må utløses.
- Deklarasjonsdelen, utførelsesdelen og unntakshåndteringsdelen er den samme som den andre PL/SQL-blokker. Erklæringsdel og unntakshåndteringsdel er valgfri.
:NY og :GAMMEL klausul
I en utløser på radnivå utløses utløseren for hver relatert rad. Og noen ganger er det nødvendig å vite verdien før og etter DML-setningen.
Oracle har gitt to klausuler i RECORD-nivåutløseren for å holde disse verdiene. Vi kan bruke disse klausulene til å referere til de gamle og nye verdiene inne i utløserkroppen.
- :NYHET – Den har en ny verdi for kolonnene i basistabellen/visningen under utløserkjøringen
- :GAMMEL – Den holder den gamle verdien av kolonnene i basistabellen/visningen under utløserkjøringen
Denne klausulen bør brukes basert på DML-hendelsen. Tabellen nedenfor vil spesifisere hvilken klausul som er gyldig for hvilken DML-setning (INSERT/UPDATE/DELETE).
| INSERT | OPPDATERING | SLETT | |
|---|---|---|---|
| :NY | GYLDIG | GYLDIG | Ugyldig. Det er ingen ny verdi i delete case. |
| :GAMMEL | Ugyldig. Det er ingen gammel verdi i innleggsboks | GYLDIG | GYLDIG |
I STEDET FOR Trigger
"INSTEAD OF trigger" er den spesielle typen trigger. Den brukes bare i DML-utløsere. Den brukes når en DML-hendelse skal oppstå på den komplekse visningen.
Tenk på et eksempel der en visning er laget av 3 grunntabeller. Når en DML-hendelse utstedes over denne visningen, blir den ugyldig fordi dataene er hentet fra 3 forskjellige tabeller. Så i denne brukes I STEDET FOR trigger. 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 grunntabeller.
- Table_1 er emp table og
- Tabell_2 er avdelingstabell.
Deretter skal vi se hvordan INSTEAD OF-utløseren brukes til å utstede OPPDATERING av stedsdetaljsetningen på denne komplekse visningen. Vi skal også se hvordan :NEW og :OLD er nyttig i triggere.
- Trinn 1: Lage tabell 'emp' og 'dept' med passende kolonner
- Trinn 2: Fyll tabellen med eksempelverdier
- Trinn 3: Opprette visning for tabellen ovenfor opprettet
- Trinn 4: Oppdatering av visning før utløseren i stedet for
- Trinn 5: Oppretting av utløseren i stedet for
- Trinn 6: Oppdatering av visning etter i stedet for trigger
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: Oppretting av tabell 'emp'.
- Kodelinje 8-12: Oppretting av tabell 'avdeling'.
Produksjon
Tabell opprettet
Trinn 2) Nå siden vi har opprettet tabellen, vil vi fylle denne tabellen med eksempelverdier og Oppretting av visninger for tabellene ovenfor.
BEGIN INSERT INTO DEPT VALUES(10,‘HR’,‘USA’); INSERT INTO DEPT VALUES(20,'SALES','UK’); INSERT INTO DEPT VALUES(30,‘FINANCIAL',‘JAPAN'); COMMIT; END; / BEGIN INSERT 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: Setter inn data i 'avdeling'-tabellen.
- Kodelinje 20-26: Setter inn data i 'emp'-tabellen.
Produksjon
PL/SQL-prosedyre ferdig
Trinn 3) Opprette en visning for tabellen ovenfor opprettet.
CREATE VIEW guru99_emp_view( Employee_name:dept_name,location) AS SELECT emp.emp_name,dept.dept_name,dept.location FROM emp,dept WHERE emp.dept_no=dept.dept_no; /
SELECT * FROM guru99_emp_view;
Kode Forklaring
- Kodelinje 27-32: Oppretting av 'guru99_emp_view'-visning.
- Kodelinje 33: Spørrende guru99_emp_view.
Produksjon
Visning opprettet
| EMPLOYEE_NAME | DEPT_NAME | OPPMØTE |
|---|---|---|
| ZZZ | HR | Norge |
| ÅÅÅ | SALGS | UK |
| XXX | FINANSIELL | JAPAN |
Trinn 4) Oppdatering av visning før i stedet for trigger.
BEGIN UPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name=:'XXX’; COMMIT; END; /
Kode Forklaring
- Kodelinje 34-38: Oppdater plasseringen av "XXX" til "FRANCE". Det reiste unntaket fordi DML uttalelser er ikke 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å feilstøtet under oppdateringsvisningen i forrige trinn, skal vi i dette trinnet bruke "i stedet for trigger."
CREATE TRIGGER guru99_view_modify_trg INSTEAD OF UPDATE ON guru99_emp_view FOR EACH ROW BEGIN UPDATE dept SET location=:new.location WHERE dept_name=:old.dept_name; END; /
Kode Forklaring
- Kodelinje 39: Oppretting av INSTEAD OF-utløseren for «UPDATE»-hendelsen i «guru99_emp_view»-visningen på ROW-nivå. Den inneholder oppdateringssetningen for å oppdatere plasseringen i basistabellen 'avdeling'.
- Kodelinje 44: Oppdateringssetningen bruker ':NEW' og ': OLD' for å finne verdien av kolonner før og etter oppdateringen.
Produksjon
Utløser opprettet
Trinn 6) Oppdatering av visning etter i stedet for trigger. Nå kommer ikke feilen da "i stedet for utløser" vil håndtere oppdateringsoperasjonen til denne komplekse visningen. Og når koden er utført, vil plasseringen til ansatt XXX bli oppdatert til "Frankrike" fra "Japan."
BEGIN UPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX'; COMMIT; END; /
SELECT * FROM guru99_emp_view;
Kodeforklaring:
- Kodelinje 49-53: Oppdatering av plasseringen av "XXX" til "FRANCE". Det er vellykket fordi "INSTEAD OF"-utløseren har stoppet den faktiske oppdateringssetningen på visning og utført oppdateringen av basistabellen.
- Kodelinje 55: Bekrefter den oppdaterte posten.
Utgang:
PL/SQL-prosedyre fullført
| EMPLOYEE_NAME | DEPT_NAME | OPPMØTE |
|---|---|---|
| ZZZ | HR | Norge |
| ÅÅÅ | SALGS | UK |
| XXX | FINANSIELL | FRANKRIKE |
Sammensatt trigger
Sammensatt utløser er en utløser som lar deg spesifisere handlinger for hvert av fire tidspunkter i enkeltutlø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 mulighet for å kombinere handlingene for forskjellig timing i samme trigger.
CREATE [ OR REPLACE ] TRIGGER <trigger_name> FOR [INSERT | UPDATE | DELET.......] ON <name of underlying object> <Declarative part> BEFORE STATEMENT IS BEGIN <Execution part>; END BEFORE STATEMENT; BEFORE EACH ROW IS BEGIN <Execution part>; END EACH ROW; AFTER EACH ROW IS BEGIN <Execution part>; END AFTER EACH ROW; AFTER STATEMENT IS BEGIN <Execution part>; END AFTER STATEMENT; END;
Syntaks forklaring:
- Syntaksen ovenfor viser opprettelsen av 'COMPOUND'-utløseren.
- Deklarativ del er felles for alle utførelsesblokkene i utløserkroppen.
- Disse 4 tidsblokkene kan være i hvilken som helst rekkefølge. Det er ikke obligatorisk å ha alle disse 4 tidsblokkene. Vi kan lage en COMPOUND-utløser bare for de tidspunktene som kreves.
Eksempel 1: I dette eksemplet skal vi lage en utløser for å automatisk fylle ut lønnskolonnen med standardverdien 5000.
CREATE TRIGGER emp_trig FOR INSERT ON emp COMPOUND TRIGGER BEFORE EACH ROW IS BEGIN :new.salary:=5000; END BEFORE EACH ROW; END emp_trig; /
BEGIN INSERT INTO EMP VALUES(1004,‘CCC’,15000,‘AAA’,30); COMMIT; END; /
SELECT * FROM emp WHERE emp_no=1004;
Kodeforklaring:
- Kodelinje 2-10: Oppretting av sammensatt trigger. Den er opprettet for timing FØR RAD-nivå for å fylle lønnen med standardverdien 5000. Dette vil endre lønnen til standardverdien '5000' før posten settes inn i tabellen.
- Kodelinje 11-14: Sett inn posten i 'emp'-tabellen.
- Kodelinje 16: Bekrefter den innsatte posten.
Utgang:
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 triggeren, må en ALTER (DDL)-setning gis for triggeren som deaktiverer eller aktiverer den.
Nedenfor er syntaksen for å aktivere/deaktivere utløsere.
ALTER TRIGGER <trigger_name> [ENABLE|DISABLE]; ALTER TABLE <table_name> [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øsere på en bestemt tabell.
Sammendrag
I dette kapittelet har vi lært om PL/SQL-utløsere og deres fordeler. Vi har også lært oss de forskjellige klassifikasjonene og diskutert I STEDET FOR trigger og COMPOUND trigger.









