Postgres pro standard de documentare 9

42.9. Proceduri de declanșare

În PL / pgSQL, puteți crea proceduri de declanșare care vor fi apelate când vor apărea schimbări de date sau evenimente în baza de date. Procedura de declanșare este creată de comanda CREATE FUNCTION. în acest caz, funcția nu ar trebui să fie argumente, iar tipul de retur trebuie să fie de declanșare (pentru declanșează acel foc atunci când se schimbă date) sau event_trigger (pentru declanșare, atunci când evenimentele din baza de date). Pentru declanșatoare, variabilele locale speciale cu numele variabilei PG_ forme sunt definite automat. Descrierea condițiilor care au declanșat declanșatorul.







42.9.1. Declanșează când schimbați datele

Declanșatorul de schimbări de date este declarat ca o funcție fără argumente și cu tipul de rezultat al declanșatorului. Rețineți că această funcție trebuie să fie declarată fără nici un argument, chiar dacă este de așteptat ca acesta va primi argumentele specificate în comanda CREATE TRIGGER - astfel de argumente sunt transmise prin TG_ARGV. așa cum este descris mai jos.

Atunci când o funcție pe PL / pgSQL declanșează ca declanșator, mai multe variabile speciale sunt create automat în blocul de nivel superior:

Tipul de date este RECORD. Variabila conține o nouă linie de baze de date pentru comenzile INSERT / UPDATE la declanșatoarele la nivel de rând. La declanșatoarele de nivel de agent și pentru instrucțiunea DELETE a acestei variabile, valoarea nu este atribuită. OLD

Tipul de date este RECORD. Variabila conține vechea linie de baze de date pentru comenzile UPDATE / DELETE la declanșatoarele la nivel de rând. La declanșatoarele de nivel de operator și pentru comanda INSERT a acestei variabile, valoarea nu este atribuită. TG_NAME

Numele tipului de date. Variabila conține numele declanșatorului declanșat. TG_WHEN

Tipul de date este text. Un șir care conține BEFORE. După sau în loc de. în funcție de definiția declanșatorului. TG_LEVEL

Tipul de date este text. Un șir care conține un ROW sau STATEMENT. în funcție de definiția declanșatorului. TG_OP

Tipul de date este text. Un șir care conține INSERT. UPDATE. DELETE sau TRUNCATE. în funcție de operațiunea pentru care a fost declanșat declanșatorul. TG_RELID

Tipul de date este oid. OID al mesei pentru care triggerul a fost declanșat. TG_RELNAME

Numele tipului de date. Numele tabelului pentru care declanșatorul a fost declanșat. Această variabilă este depășită și poate deveni indisponibilă în versiunile viitoare. În schimb, trebuie să utilizați TG_TABLE_NAME. TG_TABLE_NAME

Numele tipului de date. Numele tabelului pentru care declanșatorul a fost declanșat. TG_TABLE_SCHEMA

Numele tipului de date. Numele schemei care conține tabelul pentru care triggerul a fost declanșat. TG_NARGS

Tipul de date este întreg. Numărul de argumente în comanda CREATE TRIGGER. care sunt transmise printr-o procedură de declanșare. TG_ARGV []

Tipul de date este o matrice de text. Argumentele din declarația CREATE TRIGGER. Indicele matricei începe cu 0. Pentru valorile indexului nevalid ( <0 или>= tg_nargs) returnează NULL.

Funcția de declanșare trebuie să returneze fie NULL. sau o înregistrare / șir corespunzătoare structurii tabelului pentru care declanșatorul a fost declanșat.

Dacă declanșatorul BEFORE la nivelul rândului returnează NULL. apoi toate acțiunile suplimentare pentru a opri această linie (de ex. e. nu funcționează următorii factori declanșatori, INSERT / UPDATE / DELETE comanda pentru acest rând nu se face). Dacă întoarcerea nu este NULL. apoi continuă prelucrarea cu această linie. Returnează un alt șir decât originalul NOU. modifică șirul de inserat sau modificat. Prin urmare, dacă trebuie să efectuați anumite acțiuni în funcția de declanșare și să nu modificați sirul, trebuie să returnați variabila NEW (sau echivalentul acesteia). Pentru a schimba șirul salvat, puteți schimba valorile individuale din variabila NEW și apoi returnați-le. Fie creați și returnați o variabilă complet nouă. În cazul declanșatorului BEFORE pentru comanda DELETE, valoarea returnată însăși nu are efect direct, dar trebuie să fie diferită de NULL. astfel încât să nu întrerupă procesarea șirului. Rețineți că variabila NEW este întotdeauna NULL în flip-flop-urile DELETE. așa că nu are sens să-l returneze. Idioma tradițională pentru declanșatorii DELETE este revenirea variabilei OLD.







INSTEAD OF declanșatori pot fi returnate NUL (declanșează întotdeauna la nivel de rând și acestea sunt doar idei pot fi utilizate), pentru a arăta că nu a efectuat nicio modificare, astfel încât procesarea liniei nu poate continua (de exemplu, nu provoacă declanșatoare ulterioare nu sunt luate în considerare string în numărul de rânduri prelucrate pentru comenzile INSERT / UPDATE / DELETE din jur). În caz contrar, trebuie returnată o altă valoare decât NULL, indicând faptul că declanșatorul a efectuat operația solicitată. Pentru operațiile INSERT și UPDATE, valoarea returnată trebuie să fie NOUĂ. care funcția de declanșare poate fi modificat pentru a sprijini INSERT propuneri ÎNTOARCEREA și UPDATE REVENIREA (acest lucru va afecta, de asemenea, valoarea șirului transmis declanșatoare ulterioare, sau disponibile sub pseudonimul EXCLUSE declarație specială INSERT într-o proprietate pe CONFLICTUL DO UPDATE). Pentru operațiile DELETE, valoarea returnată trebuie să fie veche.

Valoarea returnată pentru declanșatorul de linii AFTER și declanșatoarele la nivel de operator (BEFORE sau AFTER) este întotdeauna ignorată. Aceasta poate fi NULL. Cu toate acestea, în aceste declanșatoare puteți întrerupe comanda care le-a cauzat, pentru aceasta trebuie să provocați în mod explicit o eroare.

Exemplul 42.3 prezintă un exemplu de procedură de declanșare în PL / pgSQL.

Exemplul 42.3. Procedura de declanșare PL / pgSQL

Triggerul asigură că, de fiecare dată când o înregistrare este adăugată sau modificată într-un tabel, această intrare stochează informații despre utilizatorul curent și marca de timp. De asemenea, se monitorizează faptul că numele salariatului este indicat, iar salariul este mai mare de zero.

O altă modalitate de a menține un jurnal de schimbare pentru o tabelă este crearea unui nou tabel care va conține o intrare separată pentru fiecare comandă executată INSERT, UPDATE, DELETE. Această abordare poate fi considerată ca înregistrarea modificărilor la tabel pentru un audit. Exemplul 42.4 prezintă implementarea procedurii de declanșare corespunzătoare în PL / pgSQL.

Exemplul 42.4. Procedura de declanșare a auditului în PL / pgSQL

Triggerul asigură că orice comandă pentru inserarea, modificarea sau ștergerea unui rând în tabela emp va fi scrisă pentru audit în tabela emp_audit. De asemenea, sunt înregistrate informații despre utilizatorul care a efectuat operațiunea, marcajele de timp și tipul de operare.

Exemplul anterior are o versiune care utilizează o vizualizare care conectează tabela principală și tabela de audit pentru a afișa data ultimei modificări a fiecărei linii. Această abordare menține încă o pistă de audit completă într-un tabel separat, dar există și o reprezentare cu o pistă de audit simplificată. Această vizualizare conține un marcaj de timp care este calculat pentru fiecare rând din datele din tabelul de audit. Exemplul 42.5 prezintă un exemplu de declanșator al unei prezentări pentru un audit în PL / pgSQL.

Exemplul 42.5. Declanșarea prezentării pentru audit în PL / pgSQL

Declanșare la o idee folosit pentru a face această idee o variabilă și să se asigure că orice comandă pentru a insera, modifica sau șterge rânduri în prezentare vor fi înregistrate pentru masa emp_audit de audit. Se înregistrează, de asemenea, un timestamp, un nume de utilizator și un tip de operație. Vederea arată data ultimei modificări pentru fiecare rând.

Una dintre opțiunile pentru utilizarea declanșatorilor este păstrarea tabelului separat al totalurilor actualizat pentru o anumită tabelă. În unele cazuri, în interogări, în locul tabelului principal, se poate utiliza un tabel separat cu totaluri. În acest caz, adesea timpul pentru executarea cererilor este redus semnificativ. Această tehnică este utilizată pe scară largă în depozitele de date, unde tabelele factuale pot fi foarte mari. Exemplul 42.6 prezintă procedura de declanșare în PL / pgSQL. care acceptă un tabel rezumativ pentru tabelul fact în depozitul de date.

Exemplul 42.6. Procedura de declanșare în PL / pgSQL pentru a susține tabela totalurilor

42.9.2. Evenimente declanșează evenimente

În PL / pgSQL, puteți crea declanșatoare de evenimente. Postgres Pro cere ca o procedură denumită declanșator de evenimente să fie declarată fără argumente, iar tipul valorii returnate este event_trigger.

Atunci când o funcție pe PL / pgSQL este apelată ca declanșator de evenimente, mai multe variabile speciale sunt create automat în blocul de nivel superior:

Tipul de date este text. Un șir care conține evenimentul pentru care triggerul a declanșat. TG_TAG

Tipul de date este text. O variabilă care conține eticheta comenzii pentru care triggerul a fost declanșat.

Exemplul 42.7 prezintă un exemplu de procedură de declanșare a evenimentelor în PL / pgSQL.

Exemplul 42.7. Procedura de declanșare a evenimentelor în PL / pgSQL

Acest exemplu de tip flip-flop emite un mesaj NOTICE de fiecare dată când se execută o comandă acceptată.







Trimiteți-le prietenilor: