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.
CREATE TRIGGER <trigger_name> ON<name of underlying object> DECLARE<Declaration part>BEGIN<Execution part> EXCEPTION<Exception handling part> END;
: 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
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.
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.
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.
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.”
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.”
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.
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.
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.