Cómo obtener el historial de consultas ejecutadas con nombre de usuario en SQL

11

Puedo obtener consultas ejecutadas usando:

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

pero también estoy buscando una usernamecolumna, que ejecutó estas consultas.

Hazell B
fuente
2
No, SQL Server no realiza un seguimiento de los usuarios que ejecutan consultas, a excepción de algunos DML / DDL capturados por la traza predeterminada.
Aaron Bertrand

Respuestas:

27

Le sugiero que cree un rastreo del lado del servidor o habilite la Auditoría SQL para rastrear la actividad de los usuarios en los que no confía.

Recuerde que los datos del DMV se restablecen si se borra el DMV, se reinicia el servidor SQL, etc.

Lo más cercano que puede obtener es usar la siguiente consulta:

/******************************************************
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 Shah
fuente
@kin +1 gracias por compartir este script muy útil. es de alguna manera similar a este dba.stackexchange.com/questions/135140/…
Marcello Miorelli
1
@marcellomiorelli yeh ... el script se puede usar para responder a su pregunta, pero aún así buscaría un rastreo del lado del servidor o SQLAduit. De esa manera, no tiene que preocuparse de que los datos se eliminen de los DMV.
Kin Shah
¿Cómo filtrar por sdest.Query ?
Kiquenet