Расширенному событию не удается собрать имя схемы

#sql-server #extended-events

#sql-server #расширенные события

Вопрос:

Я настроил расширенное событие для захвата событий «sp_statement_completed», сценарий для его создания приведен ниже.

 CREATE EVENT SESSION [t1] ON SERVER ADD EVENT sqlserver.sp_statement_completedADD TARGET package0.event_file(SET filename=N'D:DB_A1.xel',max_file_size=(0),max_rollover_files=(0))WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO
  

Мне нужно записать часть имени схемы для каждого события.

Пожалуйста, направьте меня.

Комментарии:

1. Привет, я не уверен, что понимаю: «часть имени схемы» каждого события? Вы имеете в виду как часть имени объекта? как в dbo. ИмяобъЕкта?

2. Имя объекта содержит только имя процедуры хранения. у него нет имени схемы.

3. Интересно. Можно подумать, что это будет предоставлено событием / -ами. Но нет. Однако ObjectId есть. Я бы использовал XML-вывод XE sessions, извлек поле object_id (что-то вроде этого: xed.event_data.value('(data[@name="object__id"]/value)[1]', 'int') AS [ObjectID]) и присоединился к sys.all_objects и sys.schemas Или использовал события, запущенные RPC / Batch, и проанализировал их из SQL_Text.

Ответ №1:

Попробуйте это:

 DECLARE @Target_Data XML =
(
SELECT TOP 1 Cast(xet.target_data AS XML) AS targetdata
FROM sys.dm_xe_session_targets AS xet
INNER JOIN sys.dm_xe_sessions AS xes ON xes.address = xet.event_session_address
WHERE xes.name = 't1'
AND xet.target_name = 'ring_buffer'
);

SELECT
  xed.event_data.value('(@name)[1]', 'varchar(50)') AS event_type,
xed.event_data.value('(data[@name="object_id"]/value)[1]', 'int') AS [object_id]
INTO #HoldXEData
FROM @Target_Data.nodes('//RingBufferTarget/event') AS xed (event_data)

SELECT XE.*, O.name AS Object_name, S.name AS Schema_name
FROM #HoldXEData AS XE
INNER JOIN sys.all_objects AS O ON XE.object_id = O.object_id
INNER JOIN sys.schemas AS S ON O.schema_id = S.schema_id

DROP TABLE #HoldXEData