如何获取在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执行这些查询的专栏。


2
不,除了默认跟踪捕获的某些DML / DDL外,SQL Server不会跟踪执行查询的用户。
亚伦·贝特朗

Answers:


27

我建议您创建服务器端跟踪或启用SQL审核以跟踪不信任用户的活动。

请记住,如果清除了DMV,重新启动了SQL Server等,则将重置DMV数据。

您可以使用以下查询获得最接近的结果:

/******************************************************
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/...
马塞罗Miorelli

1
@marcellomiorelli yeh ..脚本可用于解决您的问题,但我仍然会进行服务器端跟踪或SQLAduit。这样,您不必担心数据会从DMV中清除。
金莎(Kin Shah)2016年

如何通过sdest.Query进行过滤
Kiquenet
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.