I trigger sono degli oggetti di SQL Sever molto simili alle stored procedures, una sorta di procedura particolare che si attiva automaticamente dopo un determinato evento. Gli eventi per i quali si attiva un trigger sono lβesecuzione di una istruzione INSERT / UPDATE / DELETE su una tabella di SQL Server. Il trigger viene ancorato ad una tabella e qualora si verifichi un evento tra quelli descritti prima si attiva eseguendo il codice T-SQL contenuto al suo interno, in questa parte Γ¨ il trigger Γ¨ del tutto simile ad una stored procedure. I trigger sono utilizzati per diversi scopi nella progettazione di un database, e principalmente:
- per mantenere lβintegritΓ referenziale tra le varie tabelle
- per mantenere lβintegritΓ dei dati della singola tabella
- per monitorare i campi di una tabella ed eventualmente generare eventi ad hoc
- per creare tabelle di auditing per i record che che vengono modificati o eliminati
Un semplice esempio Γ¨ il seguente:
CREATE TRIGGER TR_DEL_Employees
ON Employees
FOR DELETE /* , INSERT, UPDATE piΓΉ azioni contemporaneamente */
AS
INSERT CrologiaImpiegati
SELECT EmployeeID, FirstName, LastName, βEliminatoβ AS Azione
FROM deleted
Il trigger si attiverΓ per ogni DELETE riguardante la tabella Employees. Quando attivato un trigger lavora su due tabelle particolari chiamate inserted e deleted: nel caso di una operazione di DELETE la tabella deleted conterrΓ le righe che sono state appena eliminate al contrario con una INSERT la tabella inserted conterrΓ le righe appena inserite. Nel caso in cui io abbia un UPDATE invece la deleted conterrΓ i dati prima della modifica (le vecchie righe) mentre la inserted conterrΓ i dati dopo la modifica. N.B. Il contenuto delle colonne con un tipo dato ntext, text ed image non vengono conderati dai triggers perchΓ© le tabelle inserted e deleted non supportano colonne con simili tipi di dato.
ROLLBACK TRAN
All βinterno di un trigger posso annullare lβoperazione di INSERT
, UPDATE
o DELETE
se esistono delle determinate condizioni. In questo caso uso la parola chiave ROLLBACK TRAN
.
Un esempio Γ¨ il seguente:
Use tempdb
GO
CREATE TRIGGER TR_UPD_test
ON t2
FOR INSERT, UPDATE
AS
IF EXISTS(SELECT 1 FROM inserted WHERE valore=βββ) BEGIN
ROLLBACK TRAN /* quella implicita del trigger */
PRINT βErrore il valore β non Γ¨ permesso!!!β
END
GO