SQL Server 2000 utilizzava i trigger. Un trigger è una particolare forma di Stored Procedure che viene attivata in automatico quando si verifica una operazione di INSERT, UPDATE o DELETE su una tabella. Il trigger risponde all'azione, dopo che l'azione è stata eseguita, ed è in grado di eseguire qualsiasi azione (supportata dal linguaggio Transact-SQL) e anche di fare un ROLLBACK della transazione che lo ha scatenato. I trigger fino a SQL Server 2000 erano quindi essenzialmente legati a istruzioni di tipo DML (Data Manipulation Language) SQL Server 2005 introduce i Trigger DDL. Un Trigger DDL è un trigger in grado di rispondere ad azioni di tipo Data Definition Language, cioè di scatenarsi quando si verificano delle operazioni di CREATE, ALTER o DROP. In parole povere, è possibile scatenare una operazione quando viene creato, modificato o eliminato un "oggetto" nel Database (Tabelle, Viste, Strored Procedures etc.) Il Trigger DDL espone tutti i dati relativi all'evento scatenante per mezzo di una funzione, chiamata eventdata() che contiene, sotto forma di XML, tutti i dettagli dell'evento. La funzione eventdata() fornisce un risultato tipo questo: <EVENT_INSTANCE> <EventType>CREATE_TABLE</EventType> <PostTime>2007-07-25T21:44:27.267</PostTime> <SPID>52</SPID> <ServerName>MyServer</ServerName> <LoginName>MyServer\User01</LoginName> <UserName>dbo</UserName> <DatabaseName>HotelList</DatabaseName> <SchemaName>dbo</SchemaName> <ObjectName>Hotels</ObjectName> <ObjectType>TABLE</ObjectType> <TSQLCommand> <SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE"/> <CommandText>create table Hotels(name varchar(50), address varchar(30), stars int)</CommandText> </TSQLCommad> </EVENT_INSTANCE> Questo frammento contiene tutto ciò che possiamo voler sapere sull'evento: EventType è il tipo di evento che ha fatto partire il Trigger, PostTime la data e l'ora dell'evento, ServerName il Server, LoginName la Login del nostro utente, TSQLCommand contiene i dettagli del comando che è stato eseguito etc. E' quindi sufficiente fare un parsing del frammento XML restituito dalla eventdata() per poter estrarre le informazioni necessarie. In questo caso ci viene in aiuto la funzione value che è possibile usare su variabili XML in SQL Server 2005, come nell'esempio seguente (clicca per ingrandire):
|