Sql-Server

SQL Server 登錄觸發器含義 - 在我的場景中是否有任何副作用?

  • May 6, 2021

我團隊中的一些開發人員知道具有擴展權限的 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);

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