Sql 如何使用用户名检索上次运行的查询

Sql 如何使用用户名检索上次运行的查询,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我最近遇到了一个问题,一些查询大量更新了我的一个表,我正试图发现可能出现的错误 我需要知道是否有任何方法可以检索至少使用用户名的上次运行的查询,以及是否可能使用@Parameters值 我在网上搜索了很多,找到了一些解决方案,如: SELECT c.session_id, s.host_name, s.login_name, s.status, st.text, s.login_time, s.program_name, * FROM sys.dm_exec_conn

我最近遇到了一个问题,一些查询大量更新了我的一个表,我正试图发现可能出现的错误

我需要知道是否有任何方法可以检索至少使用用户名的上次运行的查询,以及是否可能使用@Parameters值

我在网上搜索了很多,找到了一些解决方案,如:

SELECT 
    c.session_id, s.host_name, s.login_name, s.status, 
    st.text, s.login_time, s.program_name, *
FROM
    sys.dm_exec_connections c
INNER JOIN 
    sys.dm_exec_sessions s ON c.session_id = s.session_id
CROSS APPLY 
    sys.dm_exec_sql_text(most_recent_sql_handle) AS st
WHERE
    text LIKE '%YOURPROCHERE%'
ORDER BY 
    last_read desc

SELECT        
    SQLTEXT.text, STATS.last_execution_time, *
FROM
    sys.dm_exec_query_stats STATS
CROSS APPLY   
    sys.dm_exec_sql_text(STATS.sql_handle) AS SQLTEXT
WHERE
    STATS.last_execution_time > GETDATE()-1
    AND sqltext.text LIKE '%YOURPROCHERE%'
ORDER BY      
    STATS.last_execution_time DESC
但是这些语句都没有帮到我,它们没有返回任何与错误发生时间相匹配的结果

我发现一个查询与我的问题和运行的确切查询文本的运行时间相匹配。但是它没有向我显示用户,我也不知道如何根据表查找用户名

查询:

SELECT * 
FROM
    (SELECT 
         COALESCE(OBJECT_NAME(s2.objectid),'Ad-Hoc') AS ProcName,
         execution_count,s2.objectid, s1.sql_handle, 
         s1.plan_handle, s1.query_plan_hash,
         (SELECT TOP 1 
              SUBSTRING(s2.TEXT,statement_start_offset / 2+1 ,
              ((CASE WHEN statement_end_offset = -1
                       THEN (LEN(CONVERT(NVARCHAR(MAX),s2.TEXT)) * 2)
                       ELSE statement_end_offset 
                END) - statement_start_offset) / 2 + 1)) AS sql_statement,
         last_execution_time
     FROM 
         sys.dm_exec_query_stats AS s1
     CROSS APPLY 
         sys.dm_exec_sql_text(sql_handle) AS s2 
    ) x
WHERE 
    sql_statement NOT like 'SELECT COALESCE(OBJECT_NAME(s2%' AND sql_statement like '%YOURQUERYHERE%'
--and OBJECTPROPERTYEX(x.objectid,'IsProcedure') = 1
ORDER BY 
    last_execution_time DESC

任何帮助都将不胜感激。谢谢。

您可以尝试查看默认启用的SQL Blackbox跟踪。它捕获以前在服务器上执行的一些查询。它确实有一个限制,在繁忙的生产服务器上,它通常只限于几分钟的数据

DECLARE @filename nvarchar(512);  
SELECT @filename = CAST(value as nvarchar(512))FROM fn_trace_getinfo(1) where property = 2; 
SELECT * FROM
fn_trace_gettable (@filename, DEFAULT) WHERE TextData IS NOT NULL;

我不相信有一种简单的方法可以找到在事件发生后这么久才进行查询的人。你最好的办法是在表上放置一个触发器,每当会话用户进行更新时,该触发器将记录会话用户的用户名。谢谢你的帮助,但我昨天没有弄清楚,现在日志都不见了。我讨厌这样!所以不让我发布代码。我一直出错。谢谢你的帮助,但我昨天没能弄清楚,现在日志都不见了。