SUMAR: Acest articol a discutat despre declanșatoarele din PostgreSQL. Acesta descrie diferitele tipuri de declanșatoare și oferă exemple pentru fiecare dintre ele:
1. 2. Declanșatorul de eveniment UPDATE
3. Declanșatorul de eveniment DELETE
4. Abandonarea unui declanșator
5. Utilizări ale declanșatoarelor
6. Puncte importante de reținut
Un „declanșator” este definit ca orice eveniment care pune în mișcare un curs de acțiune.
În PostgreSQL, dacă doriți să acționați asupra unor evenimente specifice ale bazei de date, cum ar fi INSERT, UPDATE, DELETE sau TRUNCATE, atunci funcționalitatea de declanșare poate fi utilă, deoarece va invoca funcția necesară la evenimentele definite.
Dispozitivul de declanșare va fi asociat cu tabelul, vizualizarea sau tabelul străin specificat și va executa funcția specificată atunci când se efectuează anumite operații pe acel tabel. În funcție de cerință, putem crea declanșatorul ÎNAINTE, DUPĂ sau ÎNAPOI de evenimente/operații.
Tipuri de declanșatoare
1. Trigger la nivel de rând: Dacă declanșatorul este marcat FOR EACH ROW, atunci funcția de declanșare va fi apelată pentru fiecare rând care este modificat de eveniment.
De exemplu: Dacă actualizăm 100 de rânduri din tabel, funcția de declanșare UPDATE va fi apelată de 100 de ori, o dată pentru fiecare rând actualizat.
2. Declanșator la nivel de declarație: Opțiunea FOR EACH STATEMENT va apela funcția de declanșare o singură dată pentru fiecare declarație, indiferent de numărul de rânduri care se modifică.
Crearea unui declanșator
Comanda SQL CREATE TRIGGER creează un declanșator pe obiectul specificat.
Sintaxa comenzii CREATE TRIGGER este următoarea:
CREATE TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event }ON table_name ] transition_relation_name } ] { ROW | STATEMENT } ]EXECUTE { FUNCTION | PROCEDURE } function_name ( arguments ) where event can be one of: INSERTUPDATE ]DELETETRUNCATE
Pentru o descriere mai detaliată și pentru opțiunile disponibile, consultați documentația PostgreSQL la https://www.postgresql.org/docs/12/sql-createtrigger.html.
1. Declanșatorul de eveniment INSERT
Declanșatorul de eveniment INSERT este apelat atunci când o nouă înregistrare este adăugată la o tabelă folosind instrucțiunea INSERT.
Exemplu
Să aruncăm o privire asupra unui exemplu de creare a unui nou declanșator. În acest exemplu, vom crea un tabel nou numit „Employee”, după cum urmează:
CREATE TABLE "Employee"("EmployeeId" INT NOT NULL,"LastName" VARCHAR(20) NOT NULL,"FirstName" VARCHAR(20) NOT NULL,"Title" VARCHAR(30),"ReportsTo" INT,"BirthDate" TIMESTAMP,"HireDate" TIMESTAMP,"Address" VARCHAR(70),"City" VARCHAR(40),"State" VARCHAR(40),"Country" VARCHAR(40),"PostalCode" VARCHAR(10),"Phone" VARCHAR(24),"Fax" VARCHAR(24),"Email" VARCHAR(60),CONSTRAINT "PK_Employee" PRIMARY KEY ("EmployeeId"));CREATE TABLE "Employee_Audit"("EmployeeId" INT NOT NULL,"LastName" VARCHAR(20) NOT NULL,"FirstName" VARCHAR(20) NOT NULL,"UserName" VARCHAR(20) NOT NULL,"EmpAdditionTime" VARCHAR(20) NOT NULL,);
Vom crea un declanșator care poate adăuga o intrare în tabelul „Employee_Audit” în cazul în care o nouă înregistrare a unui angajat este inserată în tabelul „Employee”. Vom înregistra detaliile numelui de utilizator, care va adăuga înregistrarea în tabelul „Employee”.
Adaugați o funcție de declanșare și comanda CREATE TRIGGER:
CREATE OR REPLACE FUNCTION employee_insert_trigger_fnc() RETURNS trigger AS$$BEGIN INSERT INTO "Employee_Audit" ( "EmployeeId", "LastName", "FirstName","UserName" ,"EmpAdditionTime") VALUES(NEW."EmployeeId",NEW."LastName",NEW."FirstName",current_user,current_date);RETURN NEW;END;$$LANGUAGE 'plpgsql';CREATE TRIGGER employee_insert_trigger AFTER INSERT ON "Employee" FOR EACH ROW EXECUTE PROCEDURE employee_insert_trigger_fnc();
După ce vom crea declanșatorul INSERT de mai sus în tabel, acesta va adăuga o nouă intrare în tabelul „Employee_Audit” cu aceste detalii:
trigger_demo=# INSERT INTO "Employee" VALUES(10,' Adams','Andrew','Manager',1,'1962-02-18 00:00:00','2010-08-14 00:00:00','11120 Jasper Ave NW','Edmonton','AB','Canada','T5K 2N1','+1 780 428-9482','+1 780 428-3457','[email protected]');INSERT 0 1trigger_demo=# select * from "Employee" where "EmployeeId" =10;--------------------EmployeeId | 10LastName | AdamsFirstName | AndrewTitle | ManagerReportsTo | 1BirthDate | 1962-02-18 00:00:00HireDate | 2010-08-14 00:00:00Address | 11120 Jasper Ave NWCity | EdmontonState | ABCountry | CanadaPostalCode | T5K 2N1Phone | +1 780 428-9482Fax | +1 780 428-3457Email | [email protected]_demo=#trigger_demo=# select * from "Employee_Audit" ;----+-----------EmployeeId | 10LastName | AdamsFirstName | AndrewUserName | postgresEmpAdditionTime | 2019-11-10
2. Declanșatorul evenimentului UPDATE
Declanșatorul evenimentului UPDATE este apelat în momentul executării instrucțiunii UPDATE.
Exemplu
CREATE TRIGGER verify_user_for_update BEFORE UPDATE ON "Employee" FOR EACH ROWEXECUTE PROCEDURE employee_verify_user_priv();
3. DELETE event Trigger
Acesta este declanșatorul evenimentului DELETE, care poate fi adăugat la tranzacțiile care ELIMINĂ înregistrările.
Exemplu
CREATE TRIGGER employee_delete_trigger AFTER DELETE ON "Employee" FOR EACH ROW EXECUTE PROCEDURE aft_delete();
Dropping a Trigger
DROP TRIGGER se utilizează pentru a elimina un declanșator. Sintaxa este foarte simplă.
drop trigger employee_insert_trigger on "Employee" ;
drop trigger employee_insert_trigger on "Employee" ;
Utilizări ale declanșatorilor
1. Auditul: Puteți utiliza declanșatoarele pentru a urmări tranzacțiile din tabel prin înregistrarea detaliilor evenimentului.
2. Forțarea constrângerii de verificare: Puteți crea un trigger prin care să verificați constrângerile înainte de a aplica tranzacția în tabel.
3. Popularea automată: Prin utilizarea declanșatoarelor puteți, de asemenea, să populați automat câmpurile tabelelor prin manipularea noilor înregistrări de tranzacții.
Puncturi importante de reținut
1. Pentru a crea un declanșator pe o tabelă, utilizatorul trebuie să aibă privilegiul TRIGGER pe tabelă și privilegiul EXECUTE pe funcția de declanșare.
2. Puteți verifica catalogul de sistem „pg_trigger” pentru informații despre declanșatoarele existente în baza de date.
3. Dacă creați mai multe declanșatoare pe același obiect pentru același eveniment, aceste declanșatoare vor fi declanșate în ordine alfabetică după nume.
3.