Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Trigger | Alcuni Argomenti Aggiuntivi
Ottimizzazione SQL e Funzionalità delle Query

Trigger

Scorri per mostrare il menu

Trigger nei database sono tipi speciali di stored procedure che vengono eseguite automaticamente o attivate in risposta a determinati eventi o azioni che si verificano nel database.
Questi eventi possono includere inserimenti, aggiornamenti o eliminazioni di dati nelle tabelle e modifiche agli oggetti dello schema del database come tabelle o viste.

Trigger DML

Un trigger DML, noto anche come trigger Data Manipulation Language, è un oggetto del database che esegue automaticamente un'azione specificata quando si verifica un determinato evento su una tabella o una vista.
I trigger DML sono spesso utilizzati per applicare regole di business, mantenere l'integrità dei dati o eseguire attività di auditing.

Tipi di trigger DML

  • After Trigger: Questi trigger vengono attivati dopo che l'azione scatenante (insert, update, delete) è stata eseguita sulla tabella;
  • Before Trigger: Questi trigger vengono attivati prima dell'azione scatenante. Consentono di intercettare l'azione originale ed eseguire logica personalizzata prima di decidere se procedere o meno con l'azione originale.

Esempio di after trigger

Abbiamo già analizzato un esempio di utilizzo di una transazione per aggiungere valori alla tabella BankAccounts e alla tabella UserLogs come singola unità logica nella prima sezione di questo corso.
Ora, invece di utilizzare una transazione, possiamo ottenere lo stesso risultato creando un trigger AFTER sull'operazione INSERT all'interno della tabella BankAccounts.
Di conseguenza, sarà possibile inserire solo nuovi account, e il relativo valore di log verrà aggiunto automaticamente dal trigger.

12345678910111213141516
-- Create an after-insert trigger for UserLogs CREATE FUNCTION after_insert_trigger_function() RETURNS TRIGGER AS $$ BEGIN -- Perform some action, like logging the insert INSERT INTO UserLogs (account_number, action) VALUES (NEW.account_number, CONCAT('New record inserted for ', NEW.account_holder)); RETURN NEW; END; $$ LANGUAGE plpgsql; -- Attach the trigger to the BankAccounts table CREATE TRIGGER after_insert_trigger AFTER INSERT ON BankAccounts FOR EACH ROW EXECUTE PROCEDURE after_insert_trigger_function();
Descrizione della query
expand arrow
  • Creare un after insert trigger per user_logs:

    • Creare una funzione chiamata afterinserttriggerfunction().
    • La funzione è definita per restituire un trigger.
    • Il corpo della funzione inizia con un blocco BEGIN.
    • All'interno del blocco BEGIN, viene eseguita un'azione, ovvero l'inserimento di un record nella tabella userlogs.
    • Il record inserito contiene valori dalla riga NEW dell'evento scatenante.
    • I valori inseriti includono accountnumber e una stringa concatenata che menziona l'azione.
    • La funzione restituisce la riga NEW.
    • La funzione è scritta nel linguaggio plpgsql.
  • Associare il trigger alla tabella bankaccounts:

    • Viene creato un trigger chiamato afterinserttrigger.
    • Il trigger è impostato per essere eseguito dopo un'operazione di INSERT sulla tabella bankaccounts.
    • Il trigger è impostato per eseguire la funzione afterinserttriggerfunction per ogni riga interessata.
Note
Nota

Nei trigger di PostgreSQL, NEW è una variabile record speciale che rappresenta la nuova riga inserita o aggiornata nella tabella. Permette di accedere ai valori delle colonne della nuova riga all'interno della funzione del trigger.
Se si lavora con righe eliminate, è necessario utilizzare la variabile record OLD invece di NEW.

Esempio di trigger BEFORE

Supponiamo di voler impedire l'aggiunta di valori con un saldo del conto negativo. Possiamo creare un trigger BEFORE per ottenere questo risultato. Questo trigger controllerà il saldo prima dell'operazione e, se è negativo, l'operazione non verrà eseguita.

12345678910111213141516171819202122232425
-- Create the trigger function CREATE FUNCTION before_insert_trigger_function() RETURNS TRIGGER AS $$ BEGIN -- Check if the account balance is less than 0 IF (NEW.balance < 0) THEN -- If balance is less than 0, do nothing and return RAISE NOTICE 'Balance is less than 0. Action not logged.'; ELSE -- If balance is greater than or equal to 0, log the action RAISE NOTICE 'Logging insert into UserLogs'; -- Inserting into the UserLogs table INSERT INTO UserLogs (account_number, action) VALUES (NEW.account_number, CONCAT('Account created for ', NEW.account_holder)); END IF; -- Indicate that the trigger function has completed successfully RETURN NULL; END; $$ LANGUAGE plpgsql; -- Create the trigger CREATE TRIGGER before_insert_trigger BEFORE INSERT ON BankAccounts FOR EACH ROW EXECUTE PROCEDURE before_insert_trigger_function();
Descrizione della query
expand arrow
  • Creare la funzione trigger:

    • Creare o sostituire una funzione chiamata before_insert_userlogs().
    • La funzione è definita per restituire un trigger.
    • Il corpo della funzione inizia con un blocco BEGIN.
    • All'interno del blocco BEGIN, una condizione verifica se il saldo del conto è inferiore a 0.
    • Se il saldo è inferiore a 0, viene generato un avviso e nessuna azione viene registrata. La funzione restituisce NULL per impedire l'inserimento.
    • Se il saldo è maggiore o uguale a 0, viene generato un avviso che indica che l'azione è stata registrata.
    • La funzione quindi inserisce un record nella tabella userlogs, contenente i valori dalla riga NEW.
    • I valori inseriti includono accountnumber e una stringa concatenata che indica l'azione.
    • La funzione restituisce NEW per consentire il proseguimento dell'inserimento.
    • La funzione è scritta nel linguaggio plpgsql.
  • Creare il trigger:

    • Viene creato un trigger chiamato before_insert_userlogs_trigger.
    • Il trigger è impostato per essere eseguito prima di un'operazione di INSERT sulla tabella bankaccounts.
    • Il trigger è impostato per eseguire la funzione before_insert_userlogs() per ogni riga interessata.

Schema di creazione dei trigger

Possiamo osservare lo schema tipico per la creazione dei trigger: inizialmente, definiamo una funzione per eseguire una logica specifica prima o dopo un'operazione. Successivamente, associamo questa funzione come trigger a una tabella e a un'azione designata.

Si noti che nell'istruzione:

CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE proc_name;

abbiamo la flessibilità di utilizzare UPDATE o DELETE al posto dell'operazione INSERT.
Ma attenzione: non è possibile creare trigger su SELECT poiché l'istruzione SELECT non modifica alcuna riga nella tabella!

question mark

Qual è lo scopo principale dell'utilizzo dei trigger in un database?

Seleziona la risposta corretta

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 1

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Sezione 3. Capitolo 1
some-alt