Co je Triggeru v PL/SQL?
triggery jsou uloženy programy, které jsou spouštěny Oracle engine automaticky, když DML příkazy jako insert, update, delete jsou prováděny na stole nebo některé události nastanou. Kód, který má být excecutován v případě spouště, lze definovat podle požadavku. Můžete si vybrat událost, při které je třeba spoušť vystřelit, a načasování provedení. Účelem triggeru je zachovat integritu informací v databázi.
V tomto kurzu, budete-
- Výhody Spouští
- Typy Triggery v prostředí Oracle
- Jak Vytvořit Spouštěcí
- :NEW a :STARÉ Doložka
- MÍSTO Spoušť
- Složené Vyvolat
Výhody Spouští
Následující jsou výhody spouští.
- Generování odvozené hodnoty sloupců automaticky
- Vynucení referenční integrity
- protokolování Událostí a ukládání informací na stůl přístup
- Audit
- Synchronní replikace tabulek
- Uložení autorizace zabezpečení
- Zabránit neplatné transakce
Druhy Triggery v prostředí Oracle
aktivační události mohou být klasifikovány na základě následujících parametrů.
- Klasifikace založená na načasování
- PŘED Spoušť: požáry, před specifikované události došlo.
- Po spuštění: spustí se poté, co nastala zadaná událost.
- místo spouště: speciální typ. Dozvíte se více o dalších tématech. (pouze pro DML )
- klasifikace založená na úrovni
- trigger úrovně příkazu: spustí se jednou pro zadaný příkaz události.
- spoušť na úrovni řádku: spustí se pro každý záznam, který byl ovlivněn v zadané události. (pouze pro DML)
- klasifikace založená na události
- DML Trigger: spustí se při zadání události DML (INSERT/UPDATE/DELETE)
- DDL Trigger: Vystřelí, když DDL události je uvedeno (VYTVOŘIT/ZMĚNIT)
- DATABÁZE Spoušť: Je aktivována, když je databáze událostí je uvedeno (PŘIHLÁŠENÍ/ODHLÁŠENÍ/STARTUP/SHUTDOWN)
každá spoušť je kombinace výše uvedených parametrů.
jak vytvořit spoušť
níže je uvedena syntaxe pro vytvoření spouštěče.
CREATE TRIGGER <trigger_name> ON<name of underlying object> DECLARE<Declaration part>BEGIN<Execution part> EXCEPTION<Exception handling part> END;
Vysvětlení Syntaxe:
- výše uvedené syntaxe ukazuje různé volitelné příkazy, které jsou přítomny v trigger stvoření.
- před / po určí časování událostí.
- vložit / aktualizovat/přihlásit/vytvořit / atd. určí událost, pro kterou je třeba spustit spoušť.
- klauzule ON určí, na kterém objektu je výše uvedená událost platná. Jedná se například o název tabulky, na které může dojít k události DML v případě spouštěče DML.
- příkaz „pro každý řádek“ určí spoušť úrovně řádku.
- kdy klauzule určí dodatečnou podmínku, ve které musí spoušť vystřelit.
- část deklarace, část provádění, část zpracování výjimek je stejná jako u ostatních bloků PL / SQL. Část prohlášení a část pro zpracování výjimek jsou volitelné.
: nová a: stará klauzule
v spouštěči úrovně řádku se spustí spoušť pro každý související řádek. A někdy je nutné znát hodnotu před a po příkazu DML.
Oracle poskytl dvě klauzule ve spouštěči na úrovni záznamu, aby tyto hodnoty držel. Tyto klauzule můžeme použít k označení starých a nových hodnot uvnitř těla spouště.
- :NOVÝ – má nové hodnoty pro sloupce základní tabulky/zobrazení během spouštění triggerů
- :STARÝ – To drží staré hodnoty sloupce základní tabulky/zobrazení během spouštění triggerů
Tento bod by měl být použit na základě DML události. V následující tabulce bude uvedeno, která klauzule je platná pro který příkaz DML (INSERT / UPDATE/DELETE).
VLOŽIT | UPDATE | SMAZAT | |
: | PLATNÉ | PLATNÉ | NEPLATNÝ. V případě odstranění není žádná nová hodnota. |
:Starý | neplatný. V případě vložení neexistuje žádná stará hodnota | VALID | VALID |
místo spouště
„místo spouště“ je speciální typ spouště. Používá se pouze v spouštěčích DML. Používá se, když dojde k jakékoli události DML v komplexním zobrazení.
zvažte příklad, ve kterém je pohled vytvořen ze 3 základních tabulek. Pokud je v tomto zobrazení vydána jakákoli událost DML, stane se neplatná, protože data jsou převzata ze 3 různých tabulek. Takže v tomto místo spouště se používá. Místo triggeru se používá k úpravě základních tabulek přímo namísto úpravy zobrazení pro danou událost.
Příklad 1: v tomto příkladu vytvoříme komplexní pohled ze dvou základních tabulek.
- Table_1 je tabulka emp a
- Table_2 je tabulka oddělení.
pak uvidíme, jak se místo spouště používá k vydání aktualizace příkazu detail umístění v tomto komplexním pohledu. Uvidíme také, jak jsou: nové a: staré užitečné ve spouštěčích.
- Krok 1: Vytvoření tabulky ‚emp‘ a ‚dept‘ s příslušných sloupců
- Krok 2: Vyplnění tabulky s ukázkovými hodnotami,
- Krok 3: Vytvoření zobrazení pro výše zmíněné vytvořené tabulky
- Krok 4: Aktualizace pohledu, než na místo-trigger
- Krok 5: Vytvoření místo-trigger
- Krok 6: Aktualizace zobrazení po místo-trigger
Krok 1) Vytvoření tabulky ‚emp‘ a ‚dept‘ s vhodné sloupce,
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));/
Kód Vysvětlení
- řádek Kódu 1-7: Vytvoření tabulky.
- kódový řádek 8-12: vytvoření tabulky ‚dept‘.
Výstupní
Tabulka Vytvořena,
Krok 2) Nyní když máme vytvořeny tabulky, budeme naplnění této tabulky s ukázkovými hodnotami a Vytvoření Názorů na výše uvedené tabulky.
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;/
Kód Vysvětlení
- řádek Kódu 13-19: Vkládání dat do ‚dept‘ tabulka.
- kódový řádek 20-26: vkládání dat do tabulky‘ emp‘.
výstup
PL / SQL procedura dokončena
Krok 3) Vytvoření zobrazení pro výše vytvořenou tabulku.
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;
Kód Vysvětlení
- řádek Kódu 27-32: Vytvoření ‚guru99_emp_view‘ pohled.
- kódový řádek 33: dotazování 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‘. Vznesla výjimku, protože příkazy DML nejsou povoleny v komplexním pohledu.
Výstupní
ORA-01779: nelze změnit sloupec, který mapuje mimo klíč-zachovalé tabulky.
ORA-06512: na řádku 2,
Krok 5), Aby se zabránilo chybu dojít během aktualizace zobrazení v předchozím kroku, v tomto kroku budeme používat „místo spoušť.“
CREATE TRIGGER guru99_view_modify_trgINSTEAD OF UPDATEON guru99_emp_viewFOR EACH ROWBEGINUPDATE deptSET location=:new.locationWHERE dept_name=:old.dept_name;END;/
Kód Vysvětlení
- řádek Kódu 39: Vytvoření místo trigger pro ‚UPDATE‘ událost na‘ guru99_emp_view ‚ pohled na úrovni řádku. Obsahuje prohlášení o aktualizaci pro aktualizaci umístění v základní tabulce „dept“.
- kódový řádek 44: příkaz Update používá ‚:NEW‘ a ‚: OLD ‚ k nalezení hodnoty sloupců před a po aktualizaci.
výstup
Trigger vytvořen
Krok 6) aktualizace zobrazení po namísto-spouště. Nyní chyba nepřijde, protože „místo spouště“ zvládne operaci aktualizace tohoto komplexního zobrazení. A když kód provedl umístění zaměstnance XXX bude aktualizován na „Francie“ z “ Japonska.“
BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX'; COMMIT;END;/
SELECT * FROM guru99_emp_view;
Kód Vysvětlení:
- řádek Kódu 49-53: Aktualizace umístění „XXX“ na „FRANCIE“. Je to úspěšné, protože spoušť „místo“ zastavila zobrazení skutečného příkazu aktualizace a provedla aktualizaci základní tabulky.
- kódový řádek 55: ověření aktualizovaného záznamu.
výstup:
PL/SQL procedura úspěšně dokončena
EMPLOYEE_NAME | DEPT_NAME | UMÍSTĚNÍ |
ZZZ | HOD | USA |
YYY | PRODEJ | UK |
XXX | FINANČNÍ | FRANCIE |
Sloučenina Spoušť
Sloučenina spoušť je spoušť, která vám umožní specifikovat akce pro každý ze čtyř načasování bodů v single kohoutek těla. Čtyři různé časové body, které podporuje, jsou uvedeny níže.
- předtím, NEŽ PROHLÁŠENÍ úrovni
- PŘED ROW – level
- PO ROW – level
- PO PROHLÁŠENÍ úrovni
To poskytuje možnost kombinovat akce pro různé časování na stejnou spoušť.
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;
Vysvětlení Syntaxe:
- výše uvedené syntaxe ukazuje vytvoření ‚SLOŽENÉ‘ spoušť.
- deklarativní sekce je společná pro všechny spouštěcí bloky v těle spouště.
- tyto 4 časové bloky mohou být v libovolném pořadí. Není povinné mít všechny tyto 4 časové bloky. Můžeme vytvořit složenou spoušť pouze pro požadované časování.
Příklad 1: v tomto příkladu vytvoříme spoušť pro automatické naplnění sloupce platu výchozí hodnotou 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;
Kód Vysvětlení:
- řádek Kódu 2-10: Vytvoření složeného spoušť. Je vytvořen pro načasování před řádkovou úrovní, aby se plat naplnil výchozí hodnotou 5000. To se změní plat na výchozí hodnotu ‚5000‘ před vložením záznamu do tabulky.
- kódový řádek 11-14: vložte záznam do tabulky‘ emp‘.
- kódový řádek 16: ověření vloženého záznamu.
výstup:
Trigger vytvořen
PL / SQL procedura úspěšně dokončena.
EMP_NAME | EMP_NO | PLAT | SPRÁVCE | DEPT_NO |
CCC | 1004 | 5000 | AAA | 30 |
zapnutí a Vypnutí Spouštěče
Spouští může být povoleno nebo zakázáno. Chcete-li povolit nebo zakázat spoušť, je třeba uvést příkaz ALTER (DDL) pro spoušť, která ji deaktivuje nebo povolí.
níže je uvedena syntaxe pro povolení / zakázání spouštěčů.
ALTER TRIGGER <trigger_name> ;ALTER TABLE <table_name> ALL TRIGGERS;
vysvětlení syntaxe:
- první syntaxe ukazuje, jak povolit / zakázat jednu spoušť.
- druhý příkaz ukazuje, jak povolit / zakázat všechny spouštěče v konkrétní tabulce.
shrnutí
v této kapitole jsme se dozvěděli o spouštěčích PL/SQL a jejich výhodách. Naučili jsme se také různé klasifikace a diskutovali jsme místo spouště a složeného spouště.