как получить историю запросов, выполненных с именем пользователя в SQL

11

Я могу получить выполненные запросы, используя:

SELECT deqs.last_execution_time AS [Time]
    ,dest.TEXT AS [Query]
FROM sys.dm_exec_query_stats AS deqs
CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest
ORDER BY deqs.last_execution_time DESC

но я также ищу usernameстолбец, который выполнил эти запросы.

Hazell B
источник
2
Нет, SQL Server не отслеживает пользователей, которые выполняют запросы, за исключением некоторого DML / DDL, захваченного трассировкой по умолчанию.
Аарон Бертран

Ответы:

27

Я бы предложил вам создать трассировку на стороне сервера или включить аудит SQL для отслеживания активности пользователей, которым вы не доверяете.

Помните, что данные DMV сбрасываются, если DMV очищен, сервер SQL перезапущен и т. Д.

Самое близкое, что вы можете получить, это использовать следующий запрос:

/******************************************************
Script : Findout Who did what ?
Author : Kin Shah .. written for dba.stackexchange.com
*******************************************************/
USE master
go
SELECT sdest.DatabaseName 
    ,sdes.session_id
    ,sdes.[host_name]
    ,sdes.[program_name]
    ,sdes.client_interface_name
    ,sdes.login_name
    ,sdes.login_time
    ,sdes.nt_domain
    ,sdes.nt_user_name
    ,sdec.client_net_address
    ,sdec.local_net_address
    ,sdest.ObjName
    ,sdest.Query
FROM sys.dm_exec_sessions AS sdes
INNER JOIN sys.dm_exec_connections AS sdec ON sdec.session_id = sdes.session_id
CROSS APPLY (
    SELECT db_name(dbid) AS DatabaseName
        ,object_id(objectid) AS ObjName
        ,ISNULL((
                SELECT TEXT AS [processing-instruction(definition)]
                FROM sys.dm_exec_sql_text(sdec.most_recent_sql_handle)
                FOR XML PATH('')
                    ,TYPE
                ), '') AS Query

    FROM sys.dm_exec_sql_text(sdec.most_recent_sql_handle)
    ) sdest
where sdes.session_id <> @@SPID 
--and sdes.nt_user_name = '' -- Put the username here !
ORDER BY sdec.session_id
Кин Шах
источник
@kin +1 спасибо за то, что поделились этим очень полезным скриптом. это как-то похоже на это dba.stackexchange.com/questions/135140/…
Марчелло Миорелли
1
@marcellomiorelli, да .. сценарий может быть использован для решения вашего вопроса, но я все равно остановлюсь на трассировке на стороне сервера или SQLAduit. Таким образом, вам не нужно беспокоиться о том, что данные будут удалены из DMV.
Кин Шах
Как фильтровать по sdest.Query ?
Kiquenet