Oracle PL/SQL-i päästik: & liittüüpide asemel

⚡ Nutikas kokkuvõte

PL/SQL-päästikud on salvestatud programmid, mida Oracle mootor käivitub automaatselt DML-i, DDL-i või andmebaasi sündmuse toimumisel. Need säilitavad andmete terviklikkust, jõustavad reegleid ja toetavad auditeerimist ning hõlmavad BEFORE, AFTER, INSTEAD OF ja liittüüpe.

  • 🔔 Päästiku definitsioon: Päästik on salvestatud programm, mis Oracle mootor käivitub automaatselt määratud DML-, DDL- või andmebaasisündmuse korral.
  • 🎯 Päästiku tüübid: Päästikuid liigitatakse ajastuse (ENNE, PÄRAST, ASEMEL), taseme (LAUSE, ROW) ja sündmuse (DML, DDL, DATABASE) järgi.
  • 🔁 :UUS ja :VANA: Rea tasemel päästikud kasutavad DML-lause ees ja järel olevate veergude väärtuste lugemiseks klausleid :NEW ja :OLD.
  • 🪟 Päästiku asemel: INSTEAD OF päästik muudab muidu mitteuuendatava keeruka vaate muudetavaks, tegutsedes selle baastabelite põhjal.
  • 🧩 Liitpäästik: Liitpäästik ühendab kõigi nelja ajastuspunkti toimingud ühe päästiku korpuses.
  • 🤖 AI abi: Tehisintellekti assistendid, näiteks GitHub Copiloti mustandid ENNE, PÄRAST, ASEMEL ja kommentaarist lähtuvad liitpäästikud.

Oracle PL/SQL-päästikud, sh INSTEAD OF ja liitpäästikutüübid

Mis on Trigger PL/SQL-is?

PÄÄSTIKUD on salvestatud PL / SQL programmid, mis käivitatakse Oracle mootor automaatselt, kui DML avaldused Näiteks lisamine, värskendamine ja kustutamine käivitatakse tabelis või teatud sündmuste toimumise korral. Päästiku puhul käivitatava koodi saab määratleda vastavalt vajadusele. Saate valida sündmuse, mille korral päästik tuleb käivitada, ja käivitamise ajastuse. Päästiku eesmärk on säilitada andmebaasi teabe terviklikkus.

Päästikute eelised

Allpool on toodud päästikute eelised.

  • Mõne tuletatud veeru väärtuse automaatne genereerimine
  • Viite terviklikkuse jõustamine
  • Sündmuste logimine ja teabe salvestamine tabelijuurdepääsu kohta
  • Auditeerimine
  • Synctabelite kroonne replikatsioon
  • Turvavolituste kehtestamine
  • Kehtetute tehingute vältimine

Käivitajate tüübid Oracle

Päästikuid saab klassifitseerida järgmiste parameetrite alusel.

Klassifikatsioon ajastuse põhjal

  • ENNE Päästikut: See käivitub enne määratud sündmuse toimumist.
  • PÄRAST Päästikut: See käivitub pärast määratud sündmuse toimumist.
  • Päästiku asemel: Eriline tüüp. Lisateavet leiate järgmistest teemadest. (ainult DML-i puhul)

Klassifikatsioon taseme põhjal

  • STATEMENT taseme päästik: See käivitub määratud sündmuse avalduse korral üks kord.
  • ROW taseme päästik: See käivitub iga kirje puhul, mida määratud sündmus mõjutas. (ainult DML-i puhul)

Sündmuse põhjal klassifitseerimine

  • DML-i päästik: See käivitub, kui DML-sündmus on määratud (INSERT/UPDATE/DELETE).
  • DDL-päästik: See käivitub, kui DDL-sündmus on määratud (CREATE/ALTER).
  • ANDMEBAASI käivitaja: See käivitub andmebaasi sündmuse (LOGON/LOGOFF/STARTUP/SHUTDOWN) määramisel.

Seega on iga päästik ülaltoodud parameetrite kombinatsioon.

Päästiku loomine

Allpool on toodud päästiku loomise süntaks. Allolev ekraanipilt näitab päästiku loomise süntaksit keeles Oracle.

Käivita loomise süntaks valikutega BEFORE, AFTER ja INSTEAD OF Oracle PL / SQL

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;

Süntaksi selgitus:

  • Ülaltoodud süntaks näitab erinevaid valikulisi lauseid, mis on päästiku loomisel olemas.
  • ENNE/PÄRAST määrab sündmuste ajastuse.
  • SISESTAMINE/VÄRSKENDAMINE/LOGUN/LOO/jne. määrab sündmuse, mille puhul päästik tuleb käivitada.
  • ON-klausel määrab objekti, millel ülalmainitud sündmus kehtib. Näiteks on see tabeli nimi, millel DML-sündmus võib DML-päästiku korral toimuda.
  • Käsk „FOR EACH ROW” määrab ROW taseme päästiku.
  • WHEN-klausel määrab lisatingimuse, mille korral päästik peab käivituma.
  • Deklaratsiooniosa, teostusosa ja erandite käsitlemise osa on samad, mis teistel. PL/SQL plokidDeklaratsiooniosa ja erandite käsitlemine osad on valikulised.

:NEW ja :OLD klausel

Reataseme päästik käivitub iga seotud rea puhul. Ja mõnikord on vaja teada väärtust enne ja pärast DML-lauset.

Oracle on rea tasemel päästikus lisanud kaks klauslit nende väärtuste hoidmiseks. Neid klausleid saab kasutada päästiku sisus vanadele ja uutele väärtustele viitamiseks.

  • :UUS – See hoiab päästiku käivitamise ajal baastabeli/vaate veergude jaoks uut väärtust.
  • :VANA – See hoiab päästiku täitmise ajal baastabeli/vaate veergude vana väärtust.

Seda klauslit tuleks kasutada DML-sündmuse põhjal. Allolev tabel määrab, milline klausel kehtib millise DML-lause (INSERT/UPDATE/DELETE) jaoks.

INSERT UPDATE Kustuta
:UUS kehtiv kehtiv SOBIV. Kustutamise korral uut väärtust ei ole.
:VANA SOBIV. Sisestatavas suuruses pole vana väärtust. kehtiv kehtiv

Päästiku ASEMEL

„INSTEAD OF trigger” on eritüüpi triger. Seda kasutatakse ainult DML-i trigerites. Seda kasutatakse siis, kui keerulisel vaatel toimub mõni DML-i sündmus.

Vaatleme näidet, kus vaade luuakse kolmest baastabelist. Kui selle vaate kaudu käivitatakse mis tahes DML-sündmus, muutub see kehtetuks, kuna andmed võetakse kolmest erinevast tabelist. Seega kasutatakse antud juhul päästikut INSTEAD OF. Päästikut INSTEAD OF kasutatakse baastabelite otseseks muutmiseks, mitte vaate muutmiseks antud sündmuse jaoks.

Näide 1: Selles näites loome kahest baastabelist keeruka vaate, kus Table_1 on emp-tabel ja Table_2 on osakonna tabel.

Seejärel vaatame, kuidas päästikut INSTEAD OF kasutatakse asukoha üksikasjade UPDATE väljastamiseks sellel keerulisel vaatel. Samuti vaatame, kuidas :NEW ja :OLD on päästikutes kasulikud. Näide on tehtud järgmiste sammudega:

  • 1. samm: Sobivate veergudega tabelite 'emp' ja 'dept' loomine
  • 2. samm: tabelite täitmine näidisväärtustega
  • 3. samm: ülaltoodud tabelite vaate loomine
  • 4. samm: vaate värskendamine enne INSTEAD OF päästikut
  • 5. samm: INSTEAD OF päästiku loomine
  • 6. samm: Vaate värskendamine pärast INSTEAD OF päästikut

1. samm) Loo tabelid 'emp' ja 'dept' sobivate veergudega.

Allolev ekraanipilt näitab 'emp' ja 'dept' baastabelite loomist rakenduses Oracle.

Emp ja Dept baastabelite loomine Oracle päästiku näite INSTEAD OF jaoks

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));
/

Code Selgitus

  • Code rida 1-7: Tabeli 'emp' loomine.
  • Code rida 8-12: Tabeli 'osakond' loomine.

Väljund:

Table Created

Step 2) Nüüd, kuna oleme tabelid loonud, asustame need näidisväärtustega.

Allolev ekraanipilt näitab näidisridade lisamist tabelitesse „dept” ja „emp”.

Näidisosakonna ja töötaja ridade lisamine Oracle PL / SQL

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,'XXX',15000,'AAA',30);
INSERT INTO EMP VALUES(1001,'YYY',18000,'AAA',20) ;
INSERT INTO EMP VALUES(1002,'ZZZ',20000,'AAA',10);
COMMIT;
END;
/

Code Selgitus

  • Code rida 13-19: Andmete sisestamine tabelisse 'dept'.
  • Code rida 20-26: Andmete sisestamine tabelisse 'emp'.

Väljund:

PL/SQL procedure completed

Step 3) Vaate loomine ülaltoodud tabelite jaoks.

Allolev ekraanipilt näitab keeruka vaate loomist ja seejärel päringu esitamist.

guru99_emp_view kompleksvaate loomine ja päringu esitamine, mis ühendab emp ja dept

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;

Code Selgitus

  • Code rida 27-32: Vaate 'guru99_emp_view' loomine.
  • Code rida 33: Päringu guru99_emp_view.

Väljund:

View created
EMPLOYEE_NAME DEPT_NAME ASUKOHT
Zzz HR USA
YYY MÜÜK UK
XXX FINANCIAL Jaapan

Step 4) Vaate värskendamine enne INSTEAD OF päästikut.

Allolev ekraanipilt näitab keeruka vaate värskendamise katset ja sellest tulenevat viga.

Kompleksvaate värskendus, mis nurjus ORA-01779-ga enne INSTEAD OF päästikut

BEGIN
UPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX';
COMMIT;
END;
/

Code Selgitus

  • Code rida 34-38: Värskenda „XXX” asukohta „FRANCE”. See tekitas erandi, kuna DML-laused ei ole kompleksvaates otse lubatud.

Väljund:

ORA-01779: cannot modify a column which maps to a non key-preserved table

ORA-06512: at line 2

Step 5) Eelmises etapis vaate värskendamisel ilmnenud vea vältimiseks kasutame selles etapis päästikut „INSTEAD OF“.

Allolev ekraanipilt näitab INSTEAD OF päästiku loomist.

guru99_view_modify_trg loomine keerulises vaates päästiku ASEMEL

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;
/

Code Selgitus

  • Code rida 39: INSTEAD OF päästiku loomine sündmusele 'UPDATE' vaates 'guru99_emp_view' rea tasemel. See sisaldab värskenduslauset 'update' asukoha värskendamiseks baastabelis 'dept'.
  • Code rida 44: Värskenduslause kasutab ':NEW' ja ':OLD' veergude väärtuste leidmiseks enne ja pärast värskendamist.

Väljund:

Trigger Created

Step 6) Vaate värskendamine pärast INSTEAD OF päästikut. Nüüd viga enam ei ilmu, kuna selle keeruka vaate värskendamise toimingut haldab „INSTEAD OF päästik”. Koodi käivitamisel värskendatakse töötaja XXX asukoht „Jaapanist” „Prantsusmaaks”.

Allolev ekraanipilt näitab edukat värskendamist INSTEAD OF päästiku kaudu ja värskendatud vaadet.

Vaate uuendamine õnnestus INSTEAD OF päästiku kaudu, mis näitab asukohta FRANCE

BEGIN
UPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX';
COMMIT;
END;
/
SELECT * FROM guru99_emp_view;

Code Selgitus:

  • Code rida 49-53: „XXX” asukoha värskendamine väärtuseks „FRANCE”. See õnnestus, kuna päästik „INSTEAD OF” peatas vaate värskenduslause ja teostas baastabeli värskendamise.
  • Code rida 55: Värskendatud kirje kontrollimine.

Väljund:

PL/SQL procedure successfully completed
EMPLOYEE_NAME DEPT_NAME ASUKOHT
Zzz HR USA
YYY MÜÜK UK
XXX FINANCIAL PRANTSUSMAA

Ühendpäästik

Liitpäästik on päästik, mis võimaldab teil määrata toimingud iga nelja ajastuspunkti jaoks ühes päästiku põhiosas. See toetab nelja erinevat ajastuspunkti, mis on toodud allpool.

  • ENNE AVALDUST – tase
  • ENNE RIDA – tase
  • PÄRAST RIDA – tase
  • PÄRAST AVALDUST – tase

See annab võimaluse kombineerida erineva ajastusega toiminguid samasse päästikusse.

Allolev ekraanipilt näitab liitpäästiku süntaksit koos selle nelja ajastusosaga.

Liitpäästiku süntaks, mis näitab ENNE ja AFTER lauseid ning rea ajastussektsioone

CREATE [ OR REPLACE ] TRIGGER <trigger_name>
FOR
[INSERT | UPDATE | DELETE.......]
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;

Süntaksi selgitus:

  • Ülaltoodud süntaks näitab 'COMPOUND' päästiku loomist.
  • Deklaratiivne osa on ühine kõigile päästiku kehas olevatele täitmisplokkidele.
  • Need neli ajastusplokki võivad olla suvalises järjekorras. Kõikide nelja ajastusploki olemasolu ei ole kohustuslik. Saame luua liitpäästiku ainult vajalike ajastuste jaoks.

Näide 1: Selles näites loome päästiku, mis täidab palgaveeru automaatselt vaikeväärtusega 5000.

Allolev ekraanipilt näitab liitpäästiku näidet ja selle väljundit.

Liitpäästik, mis täidab palgaveeru automaatselt vaikeväärtusega 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;

Code Selgitus:

  • Code rida 2-10: Liitpäästiku loomine. See luuakse ajastusel ENNE ROW tasemel palga täitmiseks vaikeväärtusega 5000. See muudab palga enne kirje tabelisse lisamist vaikeväärtuseks '5000'.
  • Code rida 11-14: Sisesta kirje tabelisse 'emp'.
  • Code rida 16: Sisestatud kirje kontrollimine.

Väljund:

Trigger created

PL/SQL procedure successfully completed.
EMP_NAME EMP_NO SALARY MANAGER DEPT_NO
CCC 1004 5000 AAA 30

Päästikute lubamine ja keelamine

Päästikuid saab lubada või keelata. Päästiku lubamiseks või keelamiseks tuleb päästiku kohta anda ALTER (DDL) käsk, mis selle keelab või lubab.

Allpool on toodud päästikute lubamise/keelamise süntaks.

ALTER TRIGGER <trigger_name> [ENABLE|DISABLE];
ALTER TABLE <table_name> [ENABLE|DISABLE] ALL TRIGGERS;

Süntaksi selgitus:

  • Esimene süntaks näitab, kuidas ühte päästikut lubada/keelata.
  • Teine avaldus näitab, kuidas lubada/keelata kõiki konkreetse tabeli päästikuid.

KKK

ORA-04091 muteeriva tabeli viga ilmneb siis, kui rea tasemel päästik üritab päringut esitada või muuta sama tabelit, mis selle käivitas. Selle vältimiseks kasutage liitpäästikut, lause tasemel päästikut või hoidke ridu paketikogus.

Päästik käivitub automaatselt DML-i, DDL-i või andmebaasi sündmuse toimumisel, ei võta parameetreid ega tagasta midagi. salvestatud protseduur töötab ainult siis, kui seda selgesõnaliselt kutsute, aktsepteerib parameetreid ja saab väärtusi tagastada.

Käivitaja jäädavalt eemaldamiseks kasutage käsku DROP TRIGGER trigger_name. Erinevalt keelamisest, mis hoiab päästiku alles, kuid peatab selle käivitumise, eemaldage käskping kustutab definitsiooni täielikult, seega peate selle uuesti looma, kui loogikat uuesti vaja läheb.

Päri andmesõnastiku vaadetest USER_TRIGGERS oma päästikute või ALL_TRIGGERS iga pääsetise kohta, millele sul on juurdepääs. Need näitavad pääsetise nime, tüüpi, käivitavat sündmust, baasobjekti ja olekut, mis aitab sul olemasolevaid pääseteid auditeerida.

Mitte otse, sest päästik jagab laskmislause oma. tehingIseseisvaks kinnitamiseks deklareerige päästik või selle kutsutav protseduur funktsiooniga PRAGMA AUTONOMOUS_TRANSACTION, mis käivitab töö eraldi tehingus, mis kinnitatakse iseseisvalt.

enne Oracle Versioonis 11g ei olnud sama tüüpi päästikute järjekord garanteeritud. Alates versioonist 11g võimaldab CREATE TRIGGER lause FOLLOWS-klausel määrata, et üks päästik käivitub teise järel, andes seeläbi deterministliku täitmisjärjekorra.

Jah. GitHubi koopia mustandid ENNE, PÄRAST, ASEMEL ja liitpäästikud, sh viited :NEW ja :OLD kommentaarist. RevEnne genereeritud päästiku juurutamist vaadake ajastust, MILLAL-tingimust ja muteeriva tabeli riske.

Tehisintellekti assistendid skannivad päästikuid muteeruvate tabelite riskide, puuduvate :NEW või :OLD käsitluste, rekursiivse käivitamise ja DML-i aeglustava raske loogika suhtes. See masinõppe ülevaade märgistab habrasid päästikke ja soovitab enne koodi tootmiskeskkonda jõudmist lause- või liittasemel ümberkirjutamist.

Võta see postitus kokku järgmiselt: