Utilizzo della funzione EVENTDATAUse the EVENTDATA Function

La funzione EVENTDATA consente di acquisire le informazioni relative a un evento che attiva un trigger DDL.Information about an event that fires a DDL trigger is captured by using the EVENTDATA function. La funzione restituisce un valore xml .This function returns an xml value. XML Schema include le informazioni relative a:The XML schema includes information about the following:

  • Ora dell'evento.The time of the event.

  • ID di processo di sistema (SPID) della connessione nel momento in cui è stato eseguito il trigger.The System Process ID (SPID) of the connection when the trigger executed.

  • Tipo di evento che ha attivato il trigger.The type of event that fired the 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-SQLTransact-SQL dell'evento.Depending on the event type, the schema then includes additional information such as the database in which the event occurred, the object against which the event occurred, and the Transact-SQLTransact-SQL statement of the event. Per altre informazioni, vedere Trigger DDL.For more information, see DDL Triggers.

    Si supponga che nel database di esempio AdventureWorks2012AdventureWorks2012 venga creato il trigger DDL seguente:For example, the following DDL trigger is created in the AdventureWorks2012AdventureWorks2012 sample database:

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:The following CREATE TABLE statement is then run:

CREATE TABLE NewTable (Column1 int);

L'istruzione EVENTDATA() nel trigger DDL acquisisce il testo dell'istruzione CREATE TABLE , che non è consentita.The EVENTDATA() statement in the DDL trigger captures the text of the CREATE TABLE statement that is not allowed. A tale scopo, viene usata un'istruzione XQuery sui dati xml generati da EVENTDATA e viene recuperato l'elemento <CommandText>.This is achieved by using an XQuery statement against the xml data that is generated by EVENTDATA and retrieving the <CommandText> element. Per altre informazioni, vedere Riferimento al linguaggio XQuery (SQL Server).For more information, see XQuery Language Reference (SQL Server).

Attenzione

EVENTDATA acquisisce i dati degli eventi CREATE_SCHEMA e, se presente, il contenuto di della definizione CREATE SCHEMA corrispondente.EVENTDATA captures the data of CREATE_SCHEMA events as well as the of the corresponding CREATE SCHEMA definition, if any exists. Riconosce inoltre la definizione come evento separato.Additionally, EVENTDATA recognizes the definition as a separate event. Un trigger DDL creato in un evento CREATE_SCHEMA e un evento rappresentato dal contenuto di della definizione CREATE SCHEMA possono pertanto restituire due volte gli stessi dati di evento, ad esempio i dati TSQLCommand.Therefore, a DDL trigger created on both a CREATE_SCHEMA event, and an event represented by the of the CREATE SCHEMA definition, may return the same event data twice, such as the TSQLCommand data. 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:For example, consider a DDL trigger that is created on both the CREATE_SCHEMA and CREATE_TABLE events and the following batch is run:

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.If the application retrieves the TSQLCommand data of the CREATE_TABLE event, be aware that this data may appear two times: once when the CREATE_SCHEMA event occurs, and again when the CREATE_TABLE event occurs. Evitare di creare trigger DDL sia per gli eventi CREATE_SCHEMA che per i testi di qualsiasi definizione CREATE SCHEMA corrispondente oppure compilare nell'applicazione una logica che impedisca la doppia elaborazione dello stesso evento.Avoid creating DDL triggers on both the CREATE_SCHEMA events and the texts of any corresponding CREATE SCHEMA definitions, or build logic into your application so that the same event is not processed twice.

Eventi ALTER TABLE e ALTER DATABASEALTER TABLE and ALTER DATABASE Events

I dati degli eventi ALTER_TABLE e ALTER_DATABASE includono anche i nomi e i tipi degli altri oggetti interessati dall'istruzione DDL e dall'azione eseguita su questi oggetti.The event data for the ALTER_TABLE and ALTER_DATABASE events also includes the names and types of other objects affected by the DDL statement and the action performed on these objects. I dati degli eventi ALTER_TABLE includono i nomi delle colonne, dei vincoli o dei trigger interessati dall'istruzione ALTER TABLE e dall'azione (creazione, modifica, rimozione, abilitazione o disabilitazione) eseguita su tali oggetti.The ALTER_TABLE event data includes the names of the columns, constraints, or triggers affected by the ALTER TABLE statement and the action (create, alter, drop, enable, or disable) performed on the affected objects. I dati degli eventi ALTER_DATABASE includono i nomi di tutti i file o i filegroup interessati dall'istruzione ALTER DATABASE e dall'azione (creazione, modifica o rimozione) eseguita su tali oggetti.The ALTER_DATABASE event data includes the names of any files or filegroups affected by the ALTER DATABASE statement and the action (create, alter, or drop) performed on the affected objects.

Creare, ad esempio, il trigger DDL seguente nel database di esempio AdventureWorks:For example, create the following DDL trigger in the AdventureWorks sample database:

CREATE TRIGGER ColumnChanges  
ON DATABASE   
FOR ALTER_TABLE  
AS  
-- Detect whether a column was created/altered/dropped.  
SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'nvarchar(max)')  
RAISERROR ('Table schema cannot be modified in this database.', 16, 1);  
ROLLBACK;  

Eseguire quindi l'istruzione ALTER TABLE seguente che viola un vincolo:Then execute the following ALTER TABLE statement that violates a constraint:

ALTER TABLE Person.Address ALTER COLUMN ModifiedDate date;   

L'istruzione EVENTDATA() nel trigger DDL acquisisce il testo dell'istruzione ALTER TABLE , che non è consentita.The EVENTDATA() statement in the DDL trigger captures the text of the ALTER TABLE statement that is not permitted.

EsempioExample

È possibile utilizzare la funzione EVENTDATA per creazione di un log eventi.You can use the EVENTDATA function to create a log of events. Nell'esempio seguente viene creata una tabella per l'archiviazione delle informazioni relative agli eventi.In the following example, a table is created to store event information. 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:A DDL trigger is then created on the current database that populates the table with the following information whenever any database-level DDL event occurs:

  • Ora dell'evento (tramite la funzione GETDATE).The time of the event (using the GETDATE function).

  • Utente del database che ha attivato la sessione durante la quale è stato generato l'evento (tramite la funzione CURRENT_USER).The database user against whose session the event occurred (using the CURRENT_USER function).

  • Tipo di evento.The type of the event.

  • Istruzione Transact-SQLTransact-SQL inclusa nell'evento.The Transact-SQLTransact-SQL statement that comprised the event.

    Anche in questo caso, gli ultimi due elementi vengono acquisiti con XQuery sui dati xml generati da EVENTDATA.Again, the last two items are captured by using XQuery against the xml data that is generated by EVENTDATA.

USE AdventureWorks2012;  
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 dei dati evento, è consigliabile usare il metodo XQuery value() invece del metodo query() .To return event data, we recommend that you use the XQuery value() method instead of the query() method. Il metodo query() restituisce istanze XML e CR/LF (ritorno a capo/avanzamento riga) trasformate con il carattere di escape e commerciale (&) nell'output, mentre il metodo value() rende le istanze CR/LF invisibili nell'output.The query() method returns XML and ampersand-escaped carriage return and line-feed (CRLF) instances in the output, while the value() method renders CRLF instances invisible in the output.

Un esempio simile di trigger DDL è disponibile nel database di esempio AdventureWorks2012AdventureWorks2012 .A similar DDL trigger example is provided with the AdventureWorks2012AdventureWorks2012 sample database. Per visualizzare l'esempio, individuare la cartella Trigger database utilizzando SQL Server Management StudioSQL Server Management Studio.To obtain the example, locate the Database Triggers folder by using SQL Server Management StudioSQL Server Management Studio. Questa cartella si trova all'interno della cartella Programmabilità del database AdventureWorks2012AdventureWorks2012 .This folder is located under the Programmability folder of the AdventureWorks2012AdventureWorks2012 database. Fare clic con il pulsante destro del mouse su ddlDatabseTriggerLog e scegliere Crea script per trigger database.Right-click ddlDatabseTriggerLog and select Script Database Trigger as. Il trigger DLL ddlDatabseTriggerLog è disabilitato per impostazione predefinita.By default, DDL trigger ddlDatabseTriggerLog is disabled.

Vedere ancheSee Also

Eventi DDL DDL Events
Gruppi di eventi DDL DDL Event Groups