Làm thế nào để có được Lịch sử truy vấn được thực hiện với tên người dùng trong SQL


10

Tôi có thể nhận được các truy vấn được thực hiện bằng cách sử dụng:

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

nhưng tôi cũng đang tìm usernamecột, người đã thực hiện các truy vấn này.


2
Không, SQL Server không theo dõi người dùng thực hiện truy vấn, ngoại trừ một số DML / DDL bị bắt bởi dấu vết mặc định.
Aaron Bertrand

Câu trả lời:


26

Tôi sẽ đề nghị bạn tạo theo dõi phía máy chủ hoặc kích hoạt Kiểm toán SQL để theo dõi hoạt động từ những người dùng mà bạn không tin tưởng.

Hãy nhớ rằng dữ liệu DMV được đặt lại nếu DMV bị xóa, máy chủ sql được khởi động lại, v.v.

Cách gần nhất bạn có thể nhận được là sử dụng truy vấn bên dưới:

/******************************************************
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 cảm ơn vì đã chia sẻ tập lệnh rất hữu ích này. nó bằng cách nào đó giống với cái này dba.stackexchange.com/questions/135140/ Khăn
Marcello Miorelli

1
@marcellomiorelli yeh .. tập lệnh có thể được sử dụng để giải quyết câu hỏi của bạn, nhưng tôi vẫn sẽ truy tìm dấu vết phía máy chủ hoặc SQLAduit. Bằng cách đó, bạn không phải lo lắng về việc dữ liệu bị xóa khỏi DMV.
Kin Shah

Làm thế nào để lọc theo sdest.Query ?
Kiquenet
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.