Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

I trigger

Eventi scatenati dalla modifica di dati, o di campi, di una qualsiasi tabella
Eventi scatenati dalla modifica di dati, o di campi, di una qualsiasi tabella
Link copiato negli appunti

Gli eventi sono delle particolari procedure che avvengo in una determinata situazione del flusso del programma, queste procedure possono essere intercettate e modificate. Gli eventi del database sono chiamati trigger. Per esempio, quando cancelliamo una riga dalla tabella anagrafica, viene rilasciato un trigger. Così anche per la modifica e l'inserimento di dati o la modifica strutturale del database.

Tipologie di trigger

Le tipologie di trigger sono due:

  • DDL (data definition language): vengono scatenati ogni qual volta si cerca di fare una modifica strutturale ad un oggetto del database;
  • DML (data manipulation language): vengono scatenati ogni qual volta si agisce sui dati.

Un trigger fornisce maggior controllo sulle modifiche dei dati. Un utile esempio è sulla conferma per evitare una cancellazione, DELETE, accidentale. I trigger forniscono un maggior controllo di validità dei dati. Potremmo usare un trigger per controllare un valore inserito, se, per esempio, è presente in un'altra tabella.

Creazione di un trigger tramite T-SQL

Per creare un trigger in SQL 2005 utilizziamo il linguaggio T-SQL.

Listato 1. Creazione di un trigger per il controllo della data

GO
CREATE TRIGGER [dbo].[INSERISCI_ANA]
    ON
    [dbo].[ANAGRAFICA]
INSTEAD OF INSERT
AS
    BEGIN
        DECLARE @dataNascita DATETIME;
        SELECT @dataNascita = ANAGRAFICA.ANA_ANNO_NASCITA FROM ANAGRAFICA;
        IF @dataNascita >= GETDATE()
            RAISERROR('Errore nella data di nascita.',10,1);
            ROLLBACK;
    END

In questo primo esempio controlliamo se il valore della data di nascita, non è superiore o uguale ad oggi, altrimenti il nostro utente sarebbe un neonato. Potremmo anche avvalerci di una funzione di controllo per verificare che sia almeno maggiorenne.

Un altro caso può essere quello di inserire un determinato valore in un determinato campo, come ad esempio la data attuale per una tabella che costruisce lo storico.

Listato 2. Creazione di un trigger per l'assegnazione automatica della data

GO
CREATE TRIGGER [dbo].[DATETIME_ANA]
    ON
    [dbo].[ANAGRAFICA]
INSTEAD OF INSERT
AS
    BEGIN
        DECLARE @dataInserimento DATETIME;
        SELECT @dataInserimento = GETDATE(); 
        SELECT ANAGRAFICA.ANA_ANNO_NASCITA = @dataInserimento; 
    END

Un altro caso ancora può essere quello di un web master, che ad ogni modifica della tabella anagrafica, vuole una notifica sul suo indirizzo di posta elettronica.

Listato 3. Creazione di un trigger per invio email

EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'AdventureWorks Administrator',
    @recipients = 'danw@Adventure-Works.com',
    @body = 'Don''t forget to print a report for the sales force.',
    @subject = 'Reminder';

Modificare la struttura del database

Abbiamo detto che in SQL Server 2005 esistono due tipologie di trigger. Una di queste tipologie ci torna utile ogni qual volta si va a modificare la struttura del database. I trigger DDL controllano istruzioni di tipo CREATE, ALTER o DROP, quindi istruzioni per modificare le tabelle del database.

Sicuramente questi trigger hanno uno scopo maggiormente amministrativo. Poichè consentono il blocco o il controllo di operazioni normalmente eseguite da amministratori e non dal normale utente.

Potremmo aver necessità di modificare alcune tabelle figlie se il dato di una tabella madre viene modificato. Se si vuole creare un versioning (insieme di versioni) del database corrente.

Vediamo un semplice trigger che impedisce la modifica o cancellazione della tabella anagrafica, informando l'amministratore.

Listato 4. Creazione di un trigger per blocco

CREATE TRIGGER non_cancellare
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE
AS
PRINT 'Non si possono cancellare gli oggetti in questo database!'
ROLLBACK;

Nota: se andiamo a modificare radicalmente la struttura di un oggetto, senza aver prima eseguito un controllo di fattibilità, è probabile che alcuni trigger legati a questi oggetti, non siano più validi.

Ti consigliamo anche