查找用户在sql server中执行的查询

Ven*_*kat 3 sql-server users log trace

我想找到特定用户在一段时间内在数据库中执行的所有查询。

我了解了跟踪和 XEvents,但这些尚未设置,我仍然能够获取特定用户执行的查询吗?

Mua*_*hoj 5

您需要开始将您不信任的帐户的帐户活动记录到表中以获得完整列表。所有其他选项(例如查询 dmvs)都会为您提供时态数据,并且不能保证它是完整的。

以下是您正在寻找的示例,但请考虑创建一个作业或将这些结果记录到只有您有权查看甚至查看的表中的东西。如果存储存在问题,您可以放置​​一个过滤器,仅存储您想要监控的帐户(查看已注释掉的第二个 where 子句)。

这将查询会话信息,尽管您可能只想选择您感兴趣的列,例如数据库名称、登录名、登录时间和查询。

/******************************************************
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
Run Code Online (Sandbox Code Playgroud)