Utilizzo della funzione EVENTDATA

Data aggiornamento: 5 dicembre 2005

La funzione EVENTDATA consente di acquisire le informazioni relative a un evento che attiva un trigger DDL. La funzione restituisce un valore xml. Lo schema XML include le informazioni relative a:

  • Ora dell'evento.
  • ID di processo di sistema (SPID) della connessione nel momento in cui è stato eseguito il trigger.
  • Tipo di evento che ha attivato il trigger.

In base al tipo di evento, lo schema include informazioni aggiuntive quali il database nel quale è stato generato l'evento, l'oggetto per il quale è stato generato l'evento e l'istruzione Transact-SQL dell'evento. Per ulteriori informazioni, vedere EVENTDATA (Transact-SQL).

Si supponga che nel database di esempio AdventureWorks venga creato il trigger DDL seguente:

CREATE TRIGGER safety 
ON DATABASE 
FOR CREATE_TABLE 
AS 
    PRINT 'CREATE TABLE Issued.'
    SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
   RAISERROR ('New tables cannot be created in this database.', 16, 1) 
   ROLLBACK
;

Viene quindi eseguita l'istruzione CREATE TABLE seguente:

    CREATE TABLE NewTable (Column1 int);

L'istruzione EVENTDATA() nel trigger DDL acquisisce il testo dell'istruzione CREATE TABLE , che non è consentito. A tale scopo, viene utilizzata un'istruzione XQuery sui dati xml generati da EVENTDATA e viene recuperato l'elemento <CommandText>. Per ulteriori informazioni, vedere XQuery sul tipo di dati XML.

ms187909.Caution(it-it,SQL.90).gifAttenzione:
EVENTDATA acquisisce i dati degli eventi CREATE_SCHEMA e, se presente, il contenuto di <schema_element> della definizione CREATE SCHEMA corrispondente. Riconosce inoltre la definizione <schema_element> come evento separato. Un trigger DDL creato in un evento CREATE_SCHEMA e un evento rappresentato dal contenuto di <schema_element> della definizione CREATE SCHEMA, possono pertanto restituire due volte gli stessi dati di evento, ad esempio i dati TSQLCommand. Si consideri ad esempio la creazione di un trigger DDL su entrambi gli eventi CREATE_SCHEMA e CREATE_TABLE e la successiva esecuzione del batch seguente: CREATE SCHEMA s CREATE TABLE t1 (col1 int) È importante tenere presente che, se l'applicazione recupera i dati TSQLCommand dell'evento CREATE_TABLE, è possibile che i dati vengano visualizzati due volte: alla generazione dell'evento CREATE_SCHEMA e di nuovo alla generazione dell'evento CREATE_TABLE. Evitare di creare trigger DDL sia per gli eventi CREATE_SCHEMA che per i testi <schema_element> di qualsiasi definizione CREATE SCHEMA corrispondente, oppure implementare nell'applicazione una logica che impedisca la doppia elaborazione dello stesso evento.

Esempio

È possibile utilizzare la funzione EVENTDATA per creazione di un log eventi. Nell'esempio seguente viene creata una tabella per l'archiviazione delle informazioni relative agli eventi. Viene quindi creato nel database corrente un trigger DDL che popola la tabella con le informazioni seguenti ogni volta che viene generato un evento DDL a livello del database:

  • Ora dell'evento (tramite la funzione GETDATE).
  • Utente del database che ha attivato la sessione durante la quale è stato generato l'evento (tramite la funzione CURRENT_USER).
  • Tipo di evento.
  • Istruzione Transact-SQL inclusa nell'evento.

Anche in questo caso, per l'acquisizione degli ultimi due elementi viene utilizzato XQuery per i dati xml generati da EVENTDATA.

USE AdventureWorks;
GO
CREATE TABLE ddl_log (PostTime datetime, DB_User nvarchar(100), Event nvarchar(100), TSQL nvarchar(2000));
GO
CREATE TRIGGER log 
ON DATABASE 
FOR DDL_DATABASE_LEVEL_EVENTS 
AS
DECLARE @data XML
SET @data = EVENTDATA()
INSERT ddl_log 
   (PostTime, DB_User, Event, TSQL) 
   VALUES 
   (GETDATE(), 
   CONVERT(nvarchar(100), CURRENT_USER), 
   @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'), 
   @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)') ) ;
GO
--Test the trigger
CREATE TABLE TestTable (a int)
DROP TABLE TestTable ;
GO
SELECT * FROM ddl_log ;
GO

[!NOTA] Per la restituzione di dati sugli eventi è consigliabile utilizzare il metodo XQuery value() anziché il metodo query(). Il metodo query() restituisce output XML con le istanze CR/LF (ritorno a capo/avanzamento riga) trasformate con il carattere di escape e commerciale (&), mentre il metodo value() rende le istanze CR/LF invisibili nell'output.

Un esempio simile di trigger DDL è disponibile nel database di esempio AdventureWorks. Per visualizzare l'esempio, individuare la cartella Trigger database utilizzando SQL Server Management Studio. all'interno della cartella Programmabilità del database AdventureWorks. Fare clic con il pulsante destro del mouse su ddlDatabseTriggerLog e scegliere Crea script per trigger database. Il trigger DLL ddlDatabseTriggerLog è disattivato per impostazione predefinita.

Vedere anche

Concetti

Progettazione di trigger DDL

Guida in linea e informazioni

Assistenza su SQL Server 2005

Cronologia modifiche

Versione Cronologia

5 dicembre 2005

Nuovo contenuto:
  • Aggiunta di una sezione Attenzione sulla creazione di trigger DLL sia sugli eventi CREATE_SCHEMA che sui testi <schema_element> delle definizioni CREATE SCHEMA corrispondenti.