comment obtenir l'historique des requêtes exécutées avec le nom d'utilisateur dans SQL

11

Je peux obtenir des requêtes exécutées en utilisant:

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

mais je recherche également une usernamecolonne, qui a exécuté ces requêtes.

Hazell B
la source
2
Non, SQL Server ne garde pas la trace des utilisateurs qui exécutent des requêtes, à l'exception de certains DML / DDL capturés par la trace par défaut.
Aaron Bertrand

Réponses:

27

Je vous suggère de créer une trace côté serveur ou d'activer SQL Audit pour suivre l'activité des utilisateurs auxquels vous ne faites pas confiance.

N'oubliez pas que les données DMV sont réinitialisées si le DMV est effacé, le serveur SQL est redémarré, etc.

Le plus proche que vous pouvez obtenir est d'utiliser la requête ci-dessous:

/******************************************************
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
la source
@kin +1 merci d'avoir partagé ce script très utile. il est en quelque sorte similaire à celui-ci dba.stackexchange.com/questions/135140/…
Marcello Miorelli
1
@marcellomiorelli yeh .. le script peut être utilisé pour répondre à votre question, mais j'irais quand même pour une trace côté serveur ou SQLAduit. De cette façon, vous n'avez pas à vous soucier de la purge des données des DMV.
Kin Shah
Comment filtrer par sdest.Query ?
Kiquenet