Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a:SQL Server
Database SQL di
AzureIstanza gestita di SQL di
AzureDatabase SQL in Microsoft Fabric
La funzione EVENTDATA consente di acquisire le informazioni relative a un evento che attiva un trigger DDL. La funzione restituisce un valore xml . XML Schema include informazioni relative a:
Ora dell'evento.
ID sessione (SPID) della connessione quando viene 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 altre informazioni, vedere Trigger DDL.
Si supponga che nel database di esempio AdventureWorks2025 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 è consentita. A tale scopo, viene usata un'istruzione XQuery sui dati xml generati da EVENTDATA e viene recuperato l'elemento <CommandText>. Per altre informazioni, vedere Riferimento al linguaggio XQuery (SQL Server).
Attenzione
EVENTDATA cattura i dati degli eventi CREATE_SCHEMA così come i <schema_element> della corrispondente CREATE SCHEMA definizione, se esiste. Riconosce inoltre la definizione <schema_element> come evento separato. Pertanto, un trigger DDL creato sia su un evento CREATE_SCHEMA che su un evento rappresentato dalla <schema_element> della CREATE SCHEMA definizione può restituire gli stessi dati di evento due volte, come i TSQLCommand dati. 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. Evita di creare trigger DDL sia sugli eventi CREATE_SCHEMA che sui <testi schema_element> con definizioni corrispondenti CREATE SCHEMA , oppure integra logica nella tua applicazione in modo che lo stesso evento non venga elaborato due volte.
ALTER TABLE e ALTER DATABASE Eventi
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. I dati ALTER_TABLE evento includono i nomi delle colonne, vincoli o trigger interessati dall'istruzione ALTER TABLE e l'azione (creare, modificare, dropare, abilitare o disabilitare) eseguita sugli oggetti interessati. I dati dell'evento ALTER_DATABASE includono i nomi di eventuali file o file group interessati dall'istruzione ALTER DATABASE e l'azione (creare, modificare o drop) eseguita sugli oggetti interessati.
Creare, ad esempio, il trigger DDL seguente nel database di esempio AdventureWorks:
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;
Poi esegui la seguente ALTER TABLE istruzione che viola un vincolo:
ALTER TABLE Person.Address ALTER COLUMN ModifiedDate date;
L'istruzione EVENTDATA() nel trigger DDL acquisisce il testo dell'istruzione ALTER TABLE , che non è consentita.
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 contro la cui sessione è stato generato l'evento (utilizzando la funzione CURRENT_USER).
Tipo di evento.
L'istruzione Transact-SQL che comprendeva l'evento.
Anche in questo caso, gli ultimi due elementi vengono acquisiti con XQuery sui dati xml generati da EVENTDATA.
USE AdventureWorks2022;
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() . Il metodo query() restituisce gli XML e i caratteri di ritorno a capo e avanzamento riga (CRLF) con escape nell'output, mentre il metodo value() rende invisibili questi caratteri CRLF nell'output.
Un esempio simile di trigger DDL è disponibile nel database di esempio AdventureWorks2025 . Per visualizzare l'esempio, individuare la cartella Trigger database utilizzando SQL Server Management Studio. Questa cartella si trova nella cartella Programmabilità del database AdventureWorks2025. Fare clic con il pulsante destro del mouse su ddlDatabaseTriggerLog e scegliere Crea script per trigger database. Per impostazione predefinita, il trigger DDL ddlDatabaseTriggerLog è disabilitato.