Condividi tramite


ALTER EVENT SESSION (Transact-SQL)

Si applica a:SQL ServerIstanza gestita di Azure SQL

Consente di avviare o arrestare una sessione eventi oppure di modificare la configurazione di una sessione eventi.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

ALTER EVENT SESSION event_session_name
ON { SERVER | DATABASE }
{
    [ [ {  <add_drop_event> [ , ...n ] }
       | { <add_drop_event_target> [ , ...n ] } ]
    [ WITH ( <event_session_options> [ , ...n ] ) ]
    ]
    | [ STATE = { START | STOP } ]
}

<add_drop_event>::=
{
    [ ADD EVENT <event_specifier>
         [ ( {
                 [ SET { event_customizable_attribute = <value> [ , ...n ] } ]
                 [ ACTION ( { [event_module_guid].event_package_name.action_name [ , ...n ] } ) ]
                 [ WHERE <predicate_expression> ]
        } ) ]
   ]
   | DROP EVENT <event_specifier> }

<event_specifier> ::=
{
[event_module_guid].event_package_name.event_name
}
<predicate_expression> ::=
{
    [ NOT ] <predicate_factor> | { ( <predicate_expression> ) }
    [ { AND | OR } [ NOT ] { <predicate_factor> | ( <predicate_expression> ) } ]
    [ , ...n ]
}

<predicate_factor>::=
{
    <predicate_leaf> | ( <predicate_expression> )
}

<predicate_leaf>::=
{
      <predicate_source_declaration> { = | < > | != | > | >= | < | <= } <value>
    | [event_module_guid].event_package_name.predicate_compare_name ( <predicate_source_declaration> , <value> )
}

<predicate_source_declaration>::=
{
    event_field_name | ( [event_module_guid].event_package_name.predicate_source_name )
}

<value>::=
{
    number | 'string'
}

<add_drop_event_target>::=
{
    ADD TARGET <event_target_specifier>
        [ ( SET { target_parameter_name = <value> [ , ...n ] } ) ]
    | DROP TARGET <event_target_specifier>
}

<event_target_specifier>::=
{
    [event_module_guid].event_package_name.target_name
}

<event_session_options>::=
{
    [       MAX_MEMORY = size [ KB | MB ] ]
    [ [ , ] EVENT_RETENTION_MODE = { ALLOW_SINGLE_EVENT_LOSS | ALLOW_MULTIPLE_EVENT_LOSS | NO_EVENT_LOSS } ]
    [ [ , ] MAX_DISPATCH_LATENCY = { seconds SECONDS | INFINITE } ]
    [ [ , ] MAX_EVENT_SIZE = size [ KB | MB ] ]
    [ [ , ] MEMORY_PARTITION_MODE = { NONE | PER_NODE | PER_CPU } ]
    [ [ , ] TRACK_CAUSALITY = { ON | OFF } ]
    [ [ , ] STARTUP_STATE = { ON | OFF } ]
    [ [ , ] MAX_DURATION = { <time duration> { SECONDS | MINUTES | HOURS | DAYS } | UNLIMITED } ]
}

Argomenti

event_session_name

Nome di una sessione eventi esistente.

STATE = START | FERMARSI

Avvia o arresta la sessione dell'evento. L'argomento STATE deve essere specificato autonomamente. Non può essere combinato con altri argomenti nella stessa ALTER EVENT SESSION istruzione.

AGGIUNGI EVENTO <event_specifier>

Identifica un evento da associare alla sessione eventi. < > event_specifier è sotto forma di [event_module_guid].event_package_name. event_name, dove:

  • event_module_guid è l'identificatore univoco globale (GUID) del modulo contenente l'evento.
  • event_package_name è il pacchetto che contiene l'evento.
  • event_name è il nome dell'evento.

Per trovare gli eventi disponibili, eseguire la query seguente:

SELECT o.name AS event_name,
       o.description AS event_description,
       p.name AS package_name,
       p.description AS package_description
FROM sys.dm_xe_objects AS o
     INNER JOIN sys.dm_xe_packages AS p
         ON o.package_guid = p.guid
WHERE o.object_type = 'event'
ORDER BY event_name ASC;

SET { event_customizable_attribute = <value> [ ,... n ] }

Attributi personalizzabili per l'evento.

Gli attributi personalizzabili per un determinato evento sono disponibili eseguendo la query seguente:

SELECT object_name,
       name AS column_name,
       type_name,
       column_value,
       description
FROM sys.dm_xe_object_columns
WHERE object_name = 'event-name-placeholder'
      AND column_type = 'customizable'
ORDER BY column_name ASC;

ACTION ( { [event_module_guid].event_package_name. action_name [ ,... n ] })

Azione da associare all'evento, dove:

  • event_module_guid è il GUID del modulo che contiene l'azione.
  • event_package_name è il pacchetto che contiene l'azione.
  • action_name è il nome dell'azione.

Le azioni disponibili sono disponibili eseguendo la query seguente:

SELECT o.name AS action_name,
       o.description AS action_description,
       p.name AS package_name,
       p.description AS package_description
FROM sys.dm_xe_objects AS o
     INNER JOIN sys.dm_xe_packages AS p
         ON o.package_guid = p.guid
WHERE o.object_type = 'action'
ORDER BY action_name ASC;

DOVE <predicate_expression>

Indica l'espressione del predicato utilizzata per determinare se un evento deve essere elaborato. Se <predicate_expression> è true, l'evento viene elaborato ulteriormente dalle azioni e dalle destinazioni della sessione. Se <predicate_expression> è false, l'evento viene eliminato, evitando azioni aggiuntive e l'elaborazione di destinazione. Ogni espressione di predicato è limitata a 3.000 caratteri.

event_field_name

Nome del campo dell'evento che identifica l'origine del predicato.

I campi per un evento sono disponibili eseguendo la query seguente:

SELECT oc.name AS field_name,
       oc.type_name AS field_type,
       oc.description AS field_description
FROM sys.dm_xe_objects AS o
INNER JOIN sys.dm_xe_packages AS p
ON o.package_guid = p.guid
INNER JOIN sys.dm_xe_object_columns AS oc
ON o.name = oc.object_name
   AND
   o.package_guid = oc.object_package_guid
WHERE o.object_type = 'event'
      AND
      o.name = 'event-name-placeholder'
      AND
      oc.column_type = 'data'
ORDER BY field_name ASC;

[event_module_guid]. event_package_name. predicate_source_name

Nome dell'origine del predicato globale in cui:

  • event_module_guid è l'identificatore univoco globale (GUID) del modulo contenente l'evento.
  • event_package_name è il pacchetto che contiene l'oggetto di origine del predicato.
  • predicate_source_name è il nome dell'origine del predicato.

È possibile trovare le origini del predicato eseguendo la query seguente:

SELECT o.name AS predicate_source_name,
       o.description AS predicate_source_description,
       p.name AS package_name,
       p.description AS package_description
FROM sys.dm_xe_objects AS o
     INNER JOIN sys.dm_xe_packages AS p
         ON o.package_guid = p.guid
WHERE o.object_type = 'pred_source'
ORDER BY predicate_source ASC;

[event_module_guid].event_package_name.predicate_compare_name

Nome dell'oggetto di confronto predicato, dove:

  • event_module_guid è l'identificatore univoco globale (GUID) del modulo contenente l'evento.
  • event_package_name è il pacchetto che contiene l'oggetto di confronto del predicato.
  • predicate_compare_name è il nome del confronto predicato.

È possibile trovare i comparatori di predicati eseguendo la query seguente:

SELECT o.name AS predicate_comparator_name,
       o.description AS predicate_comparator_description,
       p.name AS package_name,
       p.description AS package_description
FROM sys.dm_xe_objects AS o
     INNER JOIN sys.dm_xe_packages AS p
         ON o.package_guid = p.guid
WHERE o.object_type = 'pred_compare'
ORDER BY predicate_comparator ASC;

numero

Qualsiasi tipo numerico che può essere rappresentato come intero a 64 bit.

'string'

Stringa ANSI o Unicode come richiesto dal comparatore di predicati. Non viene eseguita alcuna conversione del tipo di stringa implicita per le funzioni del paragone del predicato. Il passaggio del valore di un tipo imprevisto genera un errore.

EVENTO <DROP event_specifier>

Identifica un evento da rimuovere dalla sessione eventi. L'identificatore di evento è sotto forma di [event_module_guid]. event_package_name. event_name, dove:

  • event_module_guid è l'identificatore univoco globale (GUID) del modulo contenente l'evento.

  • event_package_name è il pacchetto che contiene l'oggetto dell'azione.

  • event_name è l'oggetto dell'evento.

    < > event_specifier deve identificare un evento aggiunto in precedenza alla sessione eventi.

AGGIUNGI TARGET <event_target_specifier>

Identifica una destinazione da associare a una sessione eventi. L'identificatore di destinazione dell'evento è sotto forma di [event_module_guid]. event_package_name. target_name, dove:

  • event_module_guid è l'identificatore univoco globale (GUID) del modulo contenente l'evento.
  • event_package_name è il pacchetto che contiene l'oggetto dell'azione.
  • target_name è il nome della destinazione.

È possibile trovare le destinazioni disponibili eseguendo la query seguente:

SELECT o.name AS target_name,
       o.description AS target_description,
       o.capabilities_desc,
       p.name AS package_name,
       p.description AS package_description
FROM sys.dm_xe_objects AS o
     INNER JOIN sys.dm_xe_packages AS p
         ON o.package_guid = p.guid
WHERE o.object_type = 'target'
ORDER BY target_name ASC;

Una sessione eventi può avere zero, una o più destinazioni. Tutte le destinazioni aggiunte a una sessione eventi devono essere diverse. Ad esempio, non è possibile aggiungere una seconda event_file destinazione a una sessione che ha già una event_file destinazione.

Per altre informazioni, inclusi gli esempi di utilizzo per le destinazioni di uso comune, vedere Destinazioni degli eventi estesi.

SET { target_parameter_name = <value> [ , ... n ] }

Imposta un parametro di destinazione.

Per visualizzare tutti i parametri di destinazione e le relative descrizioni, eseguire la query seguente, sostituendo target-name-placeholder con il nome di destinazione, ad esempio event_file, ring_buffer, histograme così via.

SELECT name AS target_parameter_name,
       column_value AS default_value,
       description
FROM sys.dm_xe_object_columns
WHERE column_type = 'customizable'
      AND object_name = 'target-name-placeholder';

Importante

Se si usa la destinazione del buffer circolare, è consigliabile impostare il MAX_MEMORY parametro di destinazione (distinto dal parametro di MAX_MEMORYsessione) su 1.024 kilobyte (KB) o meno per evitare il troncamento dei dati dell'output XML.

Per altre informazioni sui tipi di destinazione, vedere Destinazioni degli eventi estesi.

DROP <TARGET event_target_specifier>

Identifica una destinazione da rimuovere da una sessione eventi. L'identificatore di destinazione dell'evento è sotto forma di [event_module_guid]. event_package_name. target_name, dove:

  • event_module_guid è l'identificatore univoco globale (GUID) del modulo contenente l'evento.
  • event_package_name è il pacchetto che contiene l'oggetto dell'azione.
  • target_name è il nome della destinazione.

L'identificatore di destinazione dell'evento deve identificare una destinazione aggiunta in precedenza alla sessione eventi.

WITH ( <event_session_options> [ ,... n ] )

Specifica le opzioni da utilizzare con la sessione eventi.

MAX_MEMORY = dimensione [KB | MB ]

La quantità di memoria allocata alla sessione per la memorizzazione degli eventi nel buffer. Il valore predefinito è 4 MB. size è un numero intero e può essere espresso in kilobyte (KB) o megabyte (MB). La quantità massima non può superare 2 GB (2.048 MB). Tuttavia, l'uso di valori di memoria nell'intervallo GB non è consigliato.

EVENT_RETENTION_MODE = { ALLOW_SINGLE_EVENT_LOSS | ALLOW_MULTIPLE_EVENT_LOSS | NO_EVENT_LOSS }

Specifica la modalità di memorizzazione dell'evento da utilizzare per la gestione della perdita di eventi.

  • ALLOW_SINGLE_EVENT_LOSS

    Un evento può essere perso dalla sessione. Un evento singolo viene eliminato solo quando tutti i buffer dell'evento sono pieni. La perdita di un singolo evento quando i buffer di eventi sono completi riduce al minimo l'impatto sulle prestazioni riducendo al minimo la perdita di dati nel flusso di eventi elaborati.

  • ALLOW_MULTIPLE_EVENT_LOSS

    È possibile che vengano persi i buffer dell'evento pieni contenenti più eventi. Il numero di eventi persi dipende dalla dimensione della memoria allocata alla sessione, dalla partizione della memoria e dalla dimensione degli eventi nel buffer. Questa opzione in genere evita l'impatto sulle prestazioni sul server quando i buffer degli eventi vengono riempiti rapidamente, ma un numero elevato di eventi può essere perso dalla sessione.

  • NO_EVENT_LOSS

    Non è consentita alcuna perdita di eventi. Questa opzione assicura che tutti gli eventi generati siano mantenuti. L'utilizzo di questa opzione forza tutte le attività che attivano eventi ad aspettare fino a che lo spazio è disponibile in un buffer degli eventi. L'uso di NO_EVENT_LOSS può causare problemi di prestazioni rilevabili mentre la sessione eventi è attiva. Le sessioni utente e le query potrebbero bloccarsi durante l'attesa dello scaricamento degli eventi dal buffer.

    Annotazioni

    Per le destinazioni dei file di eventi nel database SQL di Azure e in Istanza gestita di SQL di Azure (con i criteri di aggiornamentodi SQL Server 2025 o Always-up-to-date), a partire da giugno 2024, NO_EVENT_LOSS si comporta come ALLOW_SINGLE_EVENT_LOSS. Se si specifica NO_EVENT_LOSS, viene restituito un avviso con ID messaggio 25665, gravità 10 e messaggio This target doesn't support the NO_EVENT_LOSS event retention mode. The ALLOW_SINGLE_EVENT_LOSS retention mode is used instead. e viene creata la sessione.

    Questa modifica evita timeout di connessione, ritardi di failover e altri problemi che possono ridurre la disponibilità del database quando NO_EVENT_LOSS vengono usati con destinazioni file di eventi nell'archiviazione BLOB di Azure.

    NO_EVENT_LOSS è pianificata per la rimozione come argomento supportato EVENT_RETENTION_MODE negli aggiornamenti futuri al database SQL di Azure e all'istanza gestita di SQL di Azure. Evitare di usare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata.

MAX_DISPATCH_LATENCY = { secondi SECONDI | INFINITE }

Specifica il tempo necessario all'esecuzione del buffer degli eventi nella memoria prima che vengano resi disponibili nelle destinazioni della sessione. Per impostazione predefinita, questo valore è impostato su 30 secondi.

  • Secondi SECONDI

    Tempo di attesa, espresso in secondi, prima che venga avviato lo scaricamento dei buffer alle destinazioni. seconds è un numero intero. Il valore di latenza minimo è 1 secondo. È tuttavia possibile utilizzare il valore 0 per specificare una latenza infinita.

  • INFINITO

    Scarica i buffer nelle destinazioni solo quando i buffer sono pieni o alla chiusura della sessione dell'evento.

MAX_EVENT_SIZE = dimensione [KB | MB ]

Specifica la dimensione massima consentita per gli eventi. MAX_EVENT_SIZE deve essere impostato solo per consentire singoli eventi di dimensioni maggiori di MAX_MEMORY; impostandolo su meno di MAX_MEMORY genera un errore. size è un numero intero e può essere espresso in kilobyte (KB) o megabyte (MB). Se size è espresso in kilobyte, la dimensione minima consentita è di 64 KB. Quando MAX_EVENT_SIZE è impostato, vengono creati due buffer di dimensioni oltre a MAX_MEMORY e la memoria totale usata per il buffer degli eventi è MAX_MEMORY + 2 * MAX_EVENT_SIZE.

MEMORY_PARTITION_MODE = { NESSUNO | PER_NODE | PER_CPU }

Specifica l'affinità dei buffer eventi. Le opzioni diverse da NONE comportano più buffer e un consumo di memoria superiore, ma possono evitare conflitti e migliorare le prestazioni nei computer di dimensioni maggiori.

  • NESSUNO

    Un singolo set di buffer viene creato all'interno dell'istanza del motore di database.

  • PER_NODE

    Viene creato un set di buffer per ogni nodo NUMA.

  • PER_CPU

    Viene creato un set di buffer per CPU.

TRACK_CAUSALITY = { ON | OFF }

Specifica se viene rilevata o meno la causalità degli eventi. Se abilitato, la causalità consente la correlazione di eventi correlati in diverse connessioni server.

STARTUP_STATE = { ON | OFF }

Specifica se avviare automaticamente questa sessione eventi all'avvio del motore di database.

Annotazioni

Se STARTUP_STATE = ON, la sessione eventi viene avviata quando il motore di database viene arrestato e quindi riavviato. Per avviare immediatamente la sessione eventi, usare ALTER EVENT SESSION ... ON SERVER STATE = START.

  • In...

    La sessione eventi viene avviata all'avvio.

  • OFF

    La sessione eventi non viene avviata all'avvio.

MAX_DURATION = { durata dell'ora { SECONDS | MINUTES | ORE | DAYS } | UNLIMITED }

Vale a: SQL Server 2025 (17.x)

  • ILLIMITATO

    Fa sì che una sessione eventi venga eseguita per un periodo illimitato dopo l'avvio, fino a quando non viene interrotta l'uso dell'istruzione ALTER EVENT SESSION ... STATE = STOP .

  • durata del tempo SECONDS | MINUTES | ORE | GIORNI

    Fa sì che una sessione eventi venga interrotta automaticamente dopo la scadenza del tempo specificato dopo l'avvio della sessione. La durata massima supportata è 2.147.483 secondi o 35.792 minuti o 596 ore o 24 giorni.

Per altre informazioni, vedere Sessioni di eventi associati al tempo.

Osservazioni:

Per altre informazioni sugli argomenti della sessione eventi, vedere Sessioni di eventi estesi.

Gli ADD argomenti e DROP non possono essere usati nella stessa istruzione.

Autorizzazioni

SQL Server e Istanza gestita di SQL di Azure richiedono l'autorizzazione ALTER ANY EVENT SESSION .

Il database SQL di Azure richiede l'autorizzazione ALTER ANY DATABASE EVENT SESSION nel database.

Suggerimento

SQL Server 2022 ha introdotto autorizzazioni più granulari per gli eventi estesi. Per altre informazioni, vedere Blog: Nuove autorizzazioni granulari per SQL Server 2022 e Azure SQL per migliorare l'adesione a PoLP.

Esempi

A. Avviare e arrestare una sessione eventi

Per usare questo esempio con sessioni di eventi di database, sostituire ON SERVER con ON DATABASE.

ALTER EVENT SESSION test_session ON SERVER STATE = START;
ALTER EVENT SESSION test_session ON SERVER STATE = STOP;

B. Aggiungere nuovi eventi a una sessione esistente

Per usare questo esempio con sessioni di eventi di database, sostituire ON SERVER con ON DATABASE.

ALTER EVENT SESSION test_session ON SERVER
ADD EVENT sqlserver.database_transaction_begin,
ADD EVENT sqlserver.database_transaction_end;

C. Visualizzare le statistiche della sessione

Per usare questo esempio con sessioni di eventi di database, sostituire sys.dm_xe_sessions con sys.dm_xe_database_sessionse sys.dm_xe_session_events con sys.dm_xe_database_session_events.

SELECT *
FROM sys.dm_xe_sessions
WHERE name = 'test_session';

SELECT se.*
FROM sys.dm_xe_session_events AS se
WHERE EXISTS (SELECT 1
              FROM sys.dm_xe_sessions AS s
              WHERE s.address = se.event_session_address
                    AND s.name = 'test_session');