Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base de dados SQL no Microsoft Fabric
Se tiver um script SQL Trace existente que pretende converter numa sessão de Eventos Estendidos, pode usar os procedimentos deste tópico para criar uma sessão equivalente de Eventos Estendidos. Ao usar a informação das tabelas trace_xe_action_map e trace_xe_event_map do sistema, pode recolher a informação necessária para fazer a conversão.
Os passos incluem os seguintes:
Execute o script existente para criar uma sessão SQL Trace e depois obtenha o ID do trace.
Execute uma consulta que use a função fn_trace_geteventinfo para encontrar os eventos e ações equivalentes de Eventos Estendidos para cada classe de evento SQL Trace e as suas colunas associadas.
Use a função fn_trace_getfilterinfo para listar os filtros e as ações equivalentes de Eventos Estendidos a utilizar.
Criar manualmente uma sessão de Eventos Estendidos, usando os eventos, ações e predicados (filtros) equivalentes de Eventos Estendidos.
Para obter o ID de rastreio
Abra o script SQL Trace no Editor de Consultas e depois execute o script para criar a sessão de rastreamento. Note que a sessão de rastreamento não precisa de estar a correr para completar este procedimento.
Obtenha o ID do rastreio. Para isso, utilize a seguinte consulta:
SELECT * FROM sys.traces; GOObservação
O ID de traço 1 indica tipicamente o traço padrão.
Para determinar os equivalentes dos Eventos Estendidos
Para determinar os eventos e ações equivalentes de Eventos Estendidos, execute a seguinte consulta, onde trace_id é definido para o valor do ID de traço que obteve no procedimento anterior.
Observação
Neste exemplo, é usado o ID de traço para o traço padrão (1).
USE MASTER; GO DECLARE @trace_id int; SET @trace_id = 1; SELECT DISTINCT el.eventid, em.package_name, em.xe_event_name AS 'event' , el.columnid, ec.xe_action_name AS 'action' FROM (sys.fn_trace_geteventinfo(@trace_id) AS el LEFT OUTER JOIN sys.trace_xe_event_map AS em ON el.eventid = em.trace_event_id) LEFT OUTER JOIN sys.trace_xe_action_map AS ec ON el.columnid = ec.trace_column_id WHERE em.xe_event_name IS NOT NULL AND ec.xe_action_name IS NOT NULL;O ID do evento equivalente dos Extended Events, nome do pacote, nome do evento, ID da coluna e nome da ação são retornados. Irá usar este resultado no procedimento "Para criar a sessão de Eventos Estendidos" mais adiante neste tópico.
Em alguns casos, a coluna filtrada mapeia para um campo de dados de evento que é incluído por padrão no evento Extended Events. Portanto, a coluna "Extended_Events_action_name" será NULL. Se isto ocorrer, deve fazer o seguinte para determinar qual o campo de dados que é equivalente à coluna filtrada:
Para as ações que retornam NULL, identifique quais as classes de evento SQL Trace no script que contêm a coluna que está a ser filtrada.
Por exemplo, pode ter usado a classe de evento SP:StmtCompleted e especificado um filtro no nome da coluna de rastreio Duration (ID da classe de evento do SQL Trace 45 e ID da coluna do SQL Trace 13). Neste caso, o nome da ação aparecerá como NULL nos resultados da consulta.
Para cada classe de evento SQL Trace que identificaste no passo anterior, encontra o nome equivalente do evento Extended Events. (Se não tiver a certeza do nome equivalente do evento, use a consulta no tópico Ver os Equivalentes de Eventos Estendidos às Classes de Eventos de Traço SQL.)
Use a seguinte consulta para identificar os campos de dados corretos a utilizar para os eventos que identificou no passo anterior. A consulta mostra os campos de dados de Eventos Estendidos na coluna "event_field". Na consulta, substitua< event_name> pelo nome de um evento que especificou no passo anterior.
SELECT xp.name package_name, xe.name event_name ,xc.name event_field, xc.description FROM sys.trace_xe_event_map AS em INNER JOIN sys.dm_xe_objects AS xe ON em.xe_event_name = xe.name INNER JOIN sys.dm_xe_packages AS xp ON xe.package_guid = xp.guid AND em.package_name = xp.name INNER JOIN sys.dm_xe_object_columns AS xc ON xe.name = xc.object_name WHERE xe.object_type = 'event' AND xc.column_type <> 'readonly' AND em.xe_event_name = '<event_name>';Por exemplo, a classe de evento SP:StmtCompleted corresponde ao evento sp_statement_completed Extended Events. Se especificar sp_statement_completed como nome do evento na consulta, a coluna "event_field" mostra os campos que estão incluídos por defeito com o evento. Olhando para os campos, pode ver que existe um campo de "duração". Para criar o filtro na sessão equivalente de Eventos Estendidos, adicionaria um predicado como "ONDE duração > 0". Para um exemplo, consulte o procedimento "Para criar a sessão de Eventos Estendidos" neste tópico.
Para criar a sessão de Eventos Estendidos
Use o Editor de Consultas para criar a sessão de Eventos Estendidos e escrever a saída num ficheiro de destino. Os passos seguintes descrevem uma única consulta, com explicações para lhe mostrar como construir a consulta. Para o exemplo completo da consulta, veja a secção "Exemplo" deste tópico.
Adicione instruções para criar a sessão de eventos, substituindo session_name pelo nome que pretende usar para a sessão de eventos estendidos.
IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='session_name') DROP EVENT SESSION [Session_Name] ON SERVER; CREATE EVENT SESSION [Session_Name] ON SERVER;Adicione os eventos e ações de Eventos Estendidos que foram devolvidos como saída no procedimento "Determinar os equivalentes de Eventos Estendidos", e adicione os predicados (filtros) que identificou no procedimento "Para determinar os filtros que foram usados no script".
O exemplo seguinte utiliza um script SQL Trace que inclui as classes de eventos SQL:StmtStarting e SP:StmtCompletified, com filtros para ID de sessão e duração. O exemplo de saída para a consulta do procedimento "Determine the Extended Events equivalents" resultou no seguinte conjunto de resultados:
Eventid package_name event columnid action 44 sqlserver sp_statement_starting 6 nt_username 44 sqlserver sp_statement_starting 9 client_pid 44 sqlserver sp_statement_starting 10 client_app_name 44 sqlserver sp_statement_starting 11 server_principal_name 44 sqlserver sp_statement_starting 12 session_id 45 sqlserver sp_statement_completed 6 nt_username 45 sqlserver sp_statement_completed 9 client_pid 45 sqlserver sp_statement_completed 10 client_app_name 45 sqlserver sp_statement_completed 11 server_principal_name 45 sqlserver sp_statement_completed 12 session_idPara converter isto no equivalente de Eventos Estendidos, são adicionados os eventos sqlserver.sp_statement_starting e sqlserver.sp_statement_completed, com uma lista de ações. As sentenças de predicado são incluídas como cláusulas WHERE.
ADD EVENT sqlserver.sp_statement_starting (ACTION ( sqlserver.nt_username, sqlserver.client_pid, sqlserver.client_app_name, sqlserver.server_principal_name, sqlserver.session_id ) WHERE sqlserver.session_id = 59 ), ADD EVENT sqlserver.sp_statement_completed (ACTION ( sqlserver.nt_username, sqlserver.client_pid, sqlserver.client_app_name, sqlserver.server_principal_name, sqlserver.session_id ) WHERE sqlserver.session_id = 59 AND duration > 0 )Adicione o destino do ficheiro assíncrono, substituindo os caminhos do ficheiro pelo local onde pretende guardar a saída. Ao especificar o destino do ficheiro, deve incluir um ficheiro de registo e um ficheiro de caminho do ficheiro de metadados.
ADD TARGET package0.asynchronous_file_target( SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');
Para ver os resultados
Podes usar a função sys.fn_xe_file_target_read_file para ver a saída. Para isso, execute a seguinte consulta, substituindo os caminhos dos ficheiros pelos caminhos que especificou:
SELECT *, CAST(event_data as XML) AS 'event_data_XML' FROM sys.fn_xe_file_target_read_file('c:\temp\ExtendedEventsStoredProcs*.xel', 'c:\temp\ExtendedEventsStoredProcs*.xem', NULL, NULL);Observação
A conversão dos dados do evento para XML é opcional.
Para mais informações sobre a função sys.fn_xe_file_target_read_file, veja sys.fn_xe_file_target_read_file (Transact-SQL).
IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='session_name') DROP EVENT SESSION [session_name] ON SERVER; CREATE EVENT SESSION [session_name] ON SERVER ADD EVENT sqlserver.sp_statement_starting (ACTION ( sqlserver.nt_username, sqlserver.client_pid, sqlserver.client_app_name, sqlserver.server_principal_name, sqlserver.session_id ) WHERE sqlserver.session_id = 59 ), ADD EVENT sqlserver.sp_statement_completed (ACTION ( sqlserver.nt_username, sqlserver.client_pid, sqlserver.client_app_name, sqlserver.server_principal_name, sqlserver.session_id ) WHERE sqlserver.session_id = 59 AND duration > 0 ); ADD TARGET package0.asynchronous_file_target (SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');
Example
IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='session_name')
DROP EVENT SESSION [session_name] ON SERVER;
CREATE EVENT SESSION [session_name]
ON SERVER
ADD EVENT sqlserver.sp_statement_starting
(ACTION
(
sqlserver.nt_username,
sqlserver.client_pid,
sqlserver.client_app_name,
sqlserver.server_principal_name,
sqlserver.session_id
)
WHERE sqlserver.session_id = 59
),
ADD EVENT sqlserver.sp_statement_completed
(ACTION
(
sqlserver.nt_username,
sqlserver.client_pid,
sqlserver.client_app_name,
sqlserver.server_principal_name,
sqlserver.session_id
)
WHERE sqlserver.session_id = 59 AND duration > 0
)
ADD TARGET package0.asynchronous_file_target
(SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');
Ver também
Exibir os eventos estendidos equivalentes a classes de evento de rastreamento SQL