#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