SUMMARIO: Questo articolo parla dei trigger in PostgreSQL. Descrive i diversi tipi di trigger e fornisce esempi per ciascuno:
1. Tipi di trigger
2. Creazione di un trigger
1. Innesco dell’evento INSERT
2. UPDATE
3. DELETE
4. Eliminazione di un Trigger
5. Usi dei trigger
6. Punti importanti da ricordare
Un “trigger” è definito come qualsiasi evento che imposta un corso di azione in un movimento.
In PostgreSQL, se si vuole agire su specifici eventi del database, come INSERT, UPDATE, DELETE, o TRUNCATE, allora la funzionalità trigger può essere utile in quanto invocherà la funzione richiesta sugli eventi definiti.
Il trigger sarà associato alla tabella, alla vista o alla tabella esterna specificata ed eseguirà la funzione specificata quando vengono eseguite determinate operazioni su quella tabella. A seconda del requisito possiamo creare trigger PRIMA, DOPO o PRIMA degli eventi/operazioni.
Tipi di trigger
1. Trigger a livello di riga: Se il trigger è marcato FOR EACH ROW allora la funzione di trigger sarà chiamata per ogni riga che viene modificata dall’evento.
Per esempio: Se aggiorniamo 100 righe nella tabella, la funzione di trigger UPDATE sarà chiamata 100 volte, una volta per ogni riga aggiornata.
2. Trigger a livello di dichiarazione: L’opzione FOR EACH STATEMENT chiamerà la funzione trigger solo una volta per ogni dichiarazione, indipendentemente dal numero di righe che vengono modificate.
Creazione di un Trigger
Il comando SQL CREATE TRIGGER crea un trigger sull’oggetto specificato.
La sintassi del comando CREATE TRIGGER è la seguente:
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
Per una descrizione più dettagliata e le opzioni disponibili, controlla la documentazione di PostgreSQL a https://www.postgresql.org/docs/12/sql-createtrigger.html.
1. Trigger dell’evento INSERT
Il trigger dell’evento INSERT viene chiamato quando un nuovo record viene aggiunto a una tabella utilizzando l’istruzione INSERT.
Esempio
Diamo un’occhiata a un esempio di creazione di un nuovo trigger. In questo esempio, creeremo una nuova tabella chiamata “Employee” come segue:
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,);
Creeremo un trigger che può aggiungere una voce nella tabella “Employee_Audit” se un nuovo record dipendente viene inserito nella tabella “Employee”. Stiamo per registrare i dettagli del nome utente, che aggiungerà il record nella tabella “Employee”.
Aggiungi una funzione trigger e il comando 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();
Una volta creato il trigger INSERT sulla tabella, aggiungerà una nuova voce alla tabella “Employee_Audit” con questi dettagli:
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. Trigger evento UPDATE
Il trigger evento UPDATE viene chiamato al momento dell’esecuzione dell’istruzione UPDATE.
Esempio
CREATE TRIGGER verify_user_for_update BEFORE UPDATE ON "Employee" FOR EACH ROWEXECUTE PROCEDURE employee_verify_user_priv();
3. Trigger evento DELETE
Questo è il trigger evento DELETE, che può essere aggiunto alle transazioni che eliminano i record.
Esempio
CREATE TRIGGER employee_delete_trigger AFTER DELETE ON "Employee" FOR EACH ROW EXECUTE PROCEDURE aft_delete();
Rimozione di un trigger
DROP TRIGGER è usato per rimuovere un trigger. La sintassi è molto semplice.
drop trigger employee_insert_trigger on "Employee" ;
Usi dei trigger
1. Controllo: È possibile utilizzare i trigger per tenere traccia delle transazioni della tabella registrando i dettagli dell’evento.
2. Forzare il vincolo di controllo: È possibile creare un trigger con il quale è possibile controllare i vincoli prima di applicare la transazione alla tabella.
3. Popolamento automatico: Usando i trigger si possono anche popolare automaticamente i campi delle tabelle con la manipolazione dei record delle nuove transazioni.
Punti importanti da ricordare
1. Per creare un trigger su una tabella, l’utente deve avere il privilegio TRIGGER sulla tabella e il privilegio EXECUTE sulla funzione trigger.
2. Si può controllare il catalogo di sistema “pg_trigger” per le informazioni di trigger esistenti nel database.
3. Se si creano più trigger sullo stesso oggetto per lo stesso evento, questi trigger saranno sparati in ordine alfabetico per nome.
3.