Declanșatoare (baze de date)

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

Declanșatorul , în bazele de date , este o procedură care se efectuează automat în coincidență cu un anumit eveniment, cum ar fi ștergerea unei înregistrări dintr-un tabel . În acest fel, este disponibilă o tehnică pentru a specifica și menține chiar și constrângeri complexe de integritate . Declanșatoarele permit utilizatorilor să specifice constrângeri de integritate mai complexe, având în vedere că un declanșator este în esență o procedură PL / SQL ( Oracle ), [1] Transact-SQL ( Microsoft ), [2] PL / pgSQL ( PostgreSQL ), [3] etc.

Prin urmare, această procedură este asociată cu un tabel și este apelată automat de motorul bazei de date atunci când apare o anumită modificare (sau eveniment) în cadrul tabelului. Modificările aduse tabelului pot include operații de inserare , actualizare și ștergere . [1]

Definiție

Specificarea unei reguli se face în general prin intermediul modelului ECA ( Event-Condition-Action ):

Evenimentul ( Eveniment ) poate fi:

  • o operațiune de actualizare a bazei de date
  • un eveniment sistematic
  • un eveniment extern

Condiția ( Condiție ) definește condiția care trebuie să apară înainte de a continua cu executarea regulii. Condiția este opțională:

  • dacă nu este specificat, regula se execută de fiecare dată când are loc evenimentul.
  • dacă este specificat, regula se execută numai dacă condiția este adevărată.

Acțiunea ( Acțiune ) este de obicei o secvență de comenzi SQL și / sau cod scrise cu limbaje de programare proprietare (de exemplu PL / SQL în baze de date Oracle sau Transact-SQL pe baze de date Microsoft și Sybase), dar poate fi chiar o tranzacție în baza de date sau un program extern.

Definiția unui declanșator constă din următoarele componente:

numele declanșatorului
CREAȚI [ SAU ÎNLOCUIȚI ] TRIGGER < numele declanșatorului >
localizarea temporală a declanșatorului
ÎNAINTE | DUPĂ | LOC DE
acțiune declanșatoare
INSERAȚI SAU ACTUALIZAȚI [DIN <coloană (e)>] SAU ȘTERGEȚI PE <tabel>
tip declanșator (opțional)
PENTRU FIECARE RÂND
restricții de declanșare (numai pentru declanșatoare pentru fiecare rând)
CÂND ( < condiție > )
corpul declanșator
< Bloc PL / SQL >

Clauza sau înlocuirea recreează o definiție a declanșatorului anterior dacă există și are același <nume declanșator>. Un nume de declanșator poate fi ales în mod arbitrar, dar este o convenție obișnuită să se utilizeze un nume care reflectă tabelul și evenimentele (upd_ins_EMP în exemplu). Un declanșator poate fi apelat înainte ( înainte ) sau după ( după ) evenimentul care determină declanșarea declanșatorului. [1] Evenimentul care determină declanșarea declanșatorului specifică înainte (sau după) ce operațiune din tabelul <table> ar trebui efectuată declanșatorul. Un singur eveniment este o inserare ( inserare ), o actualizare ( actualizare ) sau o ștergere ( ștergere ); evenimentele pot fi combinate folosind sau logică. [1] Dacă declanșatorul trebuie executat numai atunci când anumite coloane sunt actualizate, aceste coloane trebuie specificate după evenimentul de actualizare . [1]

Declanșatoare de nivel rând / declarație

Pentru a programa declanșatorii în mod eficient (și corect), este esențial să înțelegem diferența dintre declanșatoarele la nivel de rând și declanșatoarele la nivel de instrucțiuni . Un declanșator la nivel de rând este definit utilizând clauza pentru fiecare rând . Dacă această clauză este omisă, declanșatorul se presupune că este un declanșator la nivel de instrucțiune.

Execuţie

Un declanșator la nivel de rând se execută o dată pentru fiecare rând după (sau înainte) evenimentului care l-a provocat. În schimb, un declanșator la nivel de declarație este executat o dată după (sau înainte) evenimentului, indiferent de câte rânduri au fost afectate de eveniment. De exemplu, un declanșator de rând cu specificația evenimentului după actualizare se execută o dată pentru fiecare rând care este afectat de actualizare (sau cunoscut sub numele de actualizare). Deci, dacă actualizarea afectează douăzeci de tupluri, declanșatorul este executat de douăzeci de ori, o dată pentru fiecare rând. În schimb, un declanșator de declarație este executat o singură dată.

Caracteristicile declanșatoarelor la nivel de rând

Declanșatoarele de rând au câteva caracteristici speciale care nu sunt furnizate cu declanșatoarele de instrucțiuni: numai cu un declanșator de rând puteți accesa valorile atributelor unui tuplu (rând) înainte și după modificare, deoarece declanșatorul se execută o dată pentru fiecare tupl (rând) ).

Pentru un declanșator de actualizare, vechea valoare a atributului poate fi accesată folosind:

 : VECHI . < coloană >

și puteți accesa noul atribut folosind

 : NOU . < coloană >

Numai pentru un declanșator de inserare

 : NOU . < coloană >

poate fi utilizat și numai pentru un declanșator de ștergere

 : VECHI . < coloană >

este valid (și se referă la valoarea atributului <column> al tuplului șters). Într-un declanșator de rând, puteți specifica comparații între valoarea atributului vechi și nou în blocul PL / SQL, de exemplu:

 DACĂ : VECHI . SAL < : nou . SAL atunci ...

Dacă contextul de timp anterior este specificat pentru un declanșator de rând, este, de asemenea, posibil să modificați noua valoare a rândului, de exemplu,

 : NOU . SAL : = : NOU . SAL * 1 . 05 sau : NOU . SAL : = : VECHI . SAL .

Astfel de modificări nu sunt posibile cu declanșatoarele după rând . În general, se recomandă utilizarea unui declanșator după rând dacă noul rând nu este modificat în blocul PL / SQL. Declanșatoarele la nivel de declarație sunt utilizate în general numai împreună cu declanșatorul după.

Când clauza

Într-o definiție a declanșatorului, clauza when poate fi utilizată numai împreună cu a pentru fiecare declanșator de rând . Clauza este utilizată pentru a restricționa în continuare activarea declanșatorului. Pentru specificarea condiției în clauza when, se mențin aceleași restricții ca și clauza de verificare. Singurele excepții sunt că pot fi utilizate funcțiile sysdate și user și că pot fi referite valorile atributelor vechi / noi ale rândului curent. În acest din urmă caz, colonul ":" nu trebuie utilizat, de exemplu numai:

 VECHI . < atribut >

Și

 NOU . < atribut >

Corpul declanșatorului

Corpul declanșator constă dintr-un bloc PL / SQL. Toate comenzile SQL și PL / SQL, cu excepția celor două instrucțiuni commit și rollback, pot fi utilizate într-un bloc PL / SQL al unui declanșator. De asemenea, suplimentar dacă construcțiile permit executarea anumitor părți ale blocului PL / SQL în funcție de evenimentul care declanșează declanșatorul. Există trei construcții pentru acest lucru: dacă se introduce , dacă se actualizează [('<column>')] și dacă se șterge . Ele pot fi utilizate așa cum se arată în următorul exemplu:

 CREAȚI SAU ÎNLOCUIȚI TRIGGER-ul emp_check
DUPĂ INSERARE SAU ȘTERGERE SAU ACTUALIZARE PE EMP
PENTRU FIECARE RÂND
ÎNCEPE
    DACĂ INSERAȚI APOI
        < Bloc PL / SQL >
    ÎNCHEI DACĂ ;
    DACĂ ACTUALIZAȚI APOI
        < Bloc PL / SQL >
    ÎNCHEI DACĂ ;
    DACĂ ȘTERGEREA APOI
        < Bloc PL / SQL >
    ÎNCHEI DACĂ ;
SFARSIT ;

Este important să înțelegem că executarea unui bloc PL / SQL al unui declanșator este o parte a unei tranzacții care poate conține evenimente care determină declanșarea altor declanșatoare. De exemplu, o instrucțiune insert într-un bloc PL / SQL poate provoca declanșarea unui alt declanșator. Mai multe declanșatoare și modificări pot declanșa apoi o cascadă de declanșatoare. O astfel de secvență de declanșare se încheie cu succes dacă

  1. nu există o excepție în blocul PL / SQL, e
  2. nu a fost încălcată nicio declarație de constrângere de integritate.

Dacă un declanșator prinde o excepție într-un bloc PL / SQL, toate modificările până la începutul tranzacției sunt anulate. În blocul PL / SQL al unui declanșator, se poate ridica o excepție folosind instrucțiunea raise_application_error . Această afirmație provoacă o revenire implicită. În combinație cu un declanșator de rând, raise_application_error se poate referi la valorile vechi / noi ale rândului modificat:

 raise_application_error ( - 20020 , "Creșterea salariului de la" || la_char (: OLD . SAL ) || "la" || to_char (: NEW . SAL ) || "este prea mare" );

sau

 raise_application_error ( - 20030 , "Angajat cu Id" || to_char (: NOU . EMPNO ) || "nu există." );

Notă

  1. ^ A b c d și (EN) PL / SQL Triggers , pe docs.oracle.com, Oracle . Adus la 1 octombrie 2014 .
  2. ^ CREATE TRIGGER (Transact-SQL) , pe msdn.microsoft.com , MSDN . Adus la 1 octombrie 2014 .
  3. ^ (EN) Trigger Procedures , pe postgresql.org, PostgreSQL Global Development Group. Adus la 1 octombrie 2014 .

Elemente conexe

Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT