Sql-Server

審計 SQL Server 2008 R2 中的數據庫連接

  • February 9, 2021

我們最終計劃關閉我們最後一個 SQL Server 2008 R2 伺服器。在我們繼續之前,我們需要跟踪哪些使用者正在連接到哪些數據庫。我們嘗試了不同的選項,例如使用 SQL 審計和檢查錯誤日誌中的登錄,但所有這些都缺少連接到哪個數據庫的資訊。我們也考慮過使用 LOGON 觸發器,但由於它是在使用者登錄到實例時觸發的,所以它不會跟踪使用者之後是否更改數據庫。

在較新的版本中,我使用擴展事件進行此類審核,但此數據庫版本中尚不提供 sqlserver.login 事件。似乎應該可以為此使用 Profiler,但我擔心專門在這台舊伺服器上持續執行跟踪。是否還有其他我錯過的選項或者 Profiler 是唯一的選項?

使用下面的事件會話,您可以獲得有關已完成批次的資訊。資訊包括 database_id 和使用者名:

CREATE EVENT SESSION [QueryBatchTracking] ON SERVER 

ADD EVENT sqlserver.error_reported(
   ACTION(sqlserver.client_app_name,sqlserver.database_id,sqlserver.nt_username,sqlserver.session_id,sqlserver.username,sqlserver.sql_text)
   WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0)))),

ADD EVENT sqlserver.rpc_completed(
   ACTION(sqlserver.client_app_name,sqlserver.database_id,sqlserver.nt_username,sqlserver.session_id,sqlserver.username,sqlserver.sql_text)
   WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0)))),

ADD EVENT sqlserver.sql_statement_completed(
   ACTION(sqlserver.client_app_name,sqlserver.database_id,sqlserver.nt_username,sqlserver.session_id,sqlserver.username,sqlserver.sql_text)
   WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0))))

ADD TARGET package0.asynchronous_file_target(SET filename=N'd:\ExEvents\QueryBatchTracking.xet')
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF)
GO

ALTER EVENT SESSION QueryBatchTracking 
ON SERVER STATE = START 
GO

除了僅獲取登錄事件之外,您還將獲取有關使用者執行的操作的資訊。

引用自:https://dba.stackexchange.com/questions/285002