Trigger
I trigger nei database sono particolari tipi 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 cancellazioni di dati nelle tabelle e modifiche agli oggetti dello schema del database come tabelle o viste.
Nota
I trigger non possono essere invocati esplicitamente dagli utenti. Invece, vengono eseguiti automaticamente in risposta alle operazioni a cui sono associati.
Trigger DML
Un trigger DML, noto anche come trigger Data Manipulation Language, è un oggetto di database che esegue automaticamente un'azione specificata quando si verifica un determinato evento su una tabella o 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 (inserimento, aggiornamento, cancellazione) è stata eseguita sulla tabella;
- Before Trigger: Questi trigger vengono attivati prima dell'azione scatenante. Consentono di intercettare l'azione originale ed eseguire una 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 di 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.
-- 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();
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 trigger.
Se si lavora con righe eliminate, bisogna invece utilizzare la variabile recordOLD
invece diNEW
.
Esempio di before trigger
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.
-- 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();
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!
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione
Awesome!
Completion rate improved to 4.35
Trigger
Scorri per mostrare il menu
I trigger nei database sono particolari tipi 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 cancellazioni di dati nelle tabelle e modifiche agli oggetti dello schema del database come tabelle o viste.
Nota
I trigger non possono essere invocati esplicitamente dagli utenti. Invece, vengono eseguiti automaticamente in risposta alle operazioni a cui sono associati.
Trigger DML
Un trigger DML, noto anche come trigger Data Manipulation Language, è un oggetto di database che esegue automaticamente un'azione specificata quando si verifica un determinato evento su una tabella o 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 (inserimento, aggiornamento, cancellazione) è stata eseguita sulla tabella;
- Before Trigger: Questi trigger vengono attivati prima dell'azione scatenante. Consentono di intercettare l'azione originale ed eseguire una 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 di 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.
-- 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();
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 trigger.
Se si lavora con righe eliminate, bisogna invece utilizzare la variabile recordOLD
invece diNEW
.
Esempio di before trigger
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.
-- 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();
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!
Grazie per i tuoi commenti!