So erhalten Sie den Verlauf von Abfragen, die mit dem Benutzernamen in SQL ausgeführt werden


10

Ich kann ausgeführte Abfragen erhalten, indem ich:

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

Ich suche aber auch eine usernameKolumne, die diese Abfragen ausgeführt hat.


2
Nein, SQL Server verfolgt keine Benutzer, die Abfragen ausführen, mit Ausnahme einiger DML / DDL, die von der Standardablaufverfolgung erfasst werden.
Aaron Bertrand

Antworten:


26

Ich würde Ihnen empfehlen, eine serverseitige Ablaufverfolgung zu erstellen oder SQL Audit zu aktivieren, um Aktivitäten von Benutzern aufzuspüren, denen Sie nicht vertrauen.

Denken Sie daran, dass DMV-Daten zurückgesetzt werden, wenn die DMV gelöscht, der SQL Server neu gestartet usw. wird.

Die nächstgelegene Abfrage ist die folgende:

/******************************************************
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 danke, dass du dieses sehr nützliche Skript geteilt hast. es ist irgendwie ähnlich zu diesem dba.stackexchange.com/questions/135140/…
Marcello Miorelli

1
@marcellomiorelli yeh .. das Skript kann verwendet werden, um Ihre Frage zu beantworten, aber ich würde immer noch für einen serverseitigen Trace oder SQLAduit gehen. Auf diese Weise müssen Sie sich keine Sorgen machen, dass Daten aus DMVs gelöscht werden.
Kin Shah

Wie nach sdest.Query filtern ?
Kiquenet
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.