Sql-Server
SQL Server 登錄觸發器含義 - 在我的場景中是否有任何副作用?
我團隊中的一些開發人員知道具有擴展權限的 SQL 帳戶的密碼
我們希望在任何開發人員使用任何這些 SQL 帳戶進行連接時進行跟踪並收到警報
我們即將
logon trigger
為每次登錄嘗試實施該功能,評估登錄的屬性,並在它們符合特定條件時發送電子郵件報告。邏輯如下:如果 original_login() in (…SQL accounts list here…) 並且:
a) 客戶端 IP 地址是 192.168.xx VPN 子網(沒有生產應用程序從該子網連接,只有開發人員可以)或
b) 客戶端主機名(… Dev 的主機名稱列表…)或
c)(SSMS、az-Data 等)中的客戶端應用程序名稱
exec sp_send_dbmail(通過電子郵件向 DBA 發送報告)
觸發器將具有“執行為”子句並代表 SQL 登錄名執行,該登錄名的唯一權限是發送 db 郵件電子郵件
在 Production 上啟用這種登錄觸發器會產生什麼不良副作用?
它會減慢登錄過程或導致任何其他問題嗎?
ps 我知道
DAC
以及如何使用它。測試使用連接
DAC
並依靠它來幫助我在出現任何問題時禁用觸發器
數據庫郵件使用 Service Broker 隊列和非同步後台程序來實際發送電子郵件,因此性能應該不是什麼大問題。但是登錄觸發器很容易導致停機,因此在編寫和測試時需要非常小心。如果開發人員執行負載測試或類似的東西,您最終可能會收到數千封電子郵件。
因此,為此使用登錄觸發器可能有點過頭了。而是使用審計甚至只是一個 XEvent 會話。將數據寫入事件文件並使用計劃作業對其進行處理。
以下是創建和查詢審計的方法:
--ALTER SERVER AUDIT [sa_successful_logon] WITH (STATE = OFF); --DROP SERVER AUDIT [sa_successful_logon] go declare @logFolder nvarchar(255) = ( select [path] from sys.dm_os_server_diagnostics_log_configurations ) exec(' CREATE SERVER AUDIT [sa_successful_logon] TO FILE ( FILEPATH = '''+@logFolder+''' ) WHERE ([server_principal_name]=''sa''); ALTER SERVER AUDIT [sa_successful_logon] WITH (STATE = ON); ') GO CREATE SERVER AUDIT SPECIFICATION [sa_successful_logon_logon_spec] FOR SERVER AUDIT [sa_successful_logon] ADD (SUCCESSFUL_LOGIN_GROUP) WITH (STATE = ON) go declare @log nvarchar(255) = ( select [path] + 'sa_successful_logon*.sqlaudit' from sys.dm_os_server_diagnostics_log_configurations ) SELECT event_time, client_ip, application_name FROM sys.fn_get_audit_file (@log,default,default);