Trigger
I trigger nei database sono particolari tipi di stored procedure che vengono eseguiti automaticamente o attivati 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 a oggetti dello schema del database come tabelle o viste.
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 una vista.
I trigger DML vengono 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();
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'inserimento 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 risulta 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();
Schema di creazione di un trigger
Possiamo osservare lo schema tipico per la creazione dei trigger: inizialmente si definisce una funzione che esegue una logica specifica prima o dopo un'operazione. Successivamente, si associa questa funzione come trigger a una determinata tabella e azione.
Si noti che nell'istruzione:
CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE proc_name;
si ha 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
Can you explain the difference between AFTER and BEFORE triggers in more detail?
What are some common use cases for DML triggers in real-world applications?
How can I modify a trigger to handle UPDATE or DELETE operations instead of INSERT?
Fantastico!
Completion tasso migliorato a 4.55
Trigger
Scorri per mostrare il menu
I trigger nei database sono particolari tipi di stored procedure che vengono eseguiti automaticamente o attivati 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 a oggetti dello schema del database come tabelle o viste.
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 una vista.
I trigger DML vengono 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();
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'inserimento 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 risulta 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();
Schema di creazione di un trigger
Possiamo osservare lo schema tipico per la creazione dei trigger: inizialmente si definisce una funzione che esegue una logica specifica prima o dopo un'operazione. Successivamente, si associa questa funzione come trigger a una determinata tabella e azione.
Si noti che nell'istruzione:
CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE proc_name;
si ha 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!