登入觸發程序
登入觸發程序會引發預存程序來回應 LOGON 事件。當 SQL Server 執行個體建立使用者工作階段時,就會引發這個事件。登入觸發程序會在登入驗證階段結束之後,但在使用者工作階段實際建立之前引發。因此,從觸發程序內產生且一般會顯示給使用者的所有訊息,例如錯誤訊息和來自 PRINT 陳述式的訊息,都會轉至 SQL Server 錯誤記錄檔。如果驗證失敗,登入觸發程序就不會引發。
您可以使用登入觸發程序稽核和控制伺服器工作階段,例如追蹤登入活動、限制登入 SQL Server,或限制特定登入的工作階段數。例如,在下列程式碼中,如果登入 login_test 已經建立三個使用者工作階段,登入觸發程序就會拒絕該登入對 SQL Server 所起始的登入嘗試。
USE master;
GO
CREATE LOGIN login_test WITH PASSWORD = '3KHJ6dhx(0xVYsdf' MUST_CHANGE,
CHECK_EXPIRATION = ON;
GO
GRANT VIEW SERVER STATE TO login_test;
GO
CREATE TRIGGER connection_limit_trigger
ON ALL SERVER WITH EXECUTE AS 'login_test'
FOR LOGON
AS
BEGIN
IF ORIGINAL_LOGIN()= 'login_test' AND
(SELECT COUNT(*) FROM sys.dm_exec_sessions
WHERE is_user_process = 1 AND
original_login_name = 'login_test') > 3
ROLLBACK;
END;
請注意,LOGON 事件對應於 AUDIT_LOGIN SQL Trace 事件,該事件可用於事件通知。觸發程序與事件通知的主要差別在於,觸發程序會與事件同步引發,而事件通知則是非同步的。這表示如果不要建立工作階段,就必須使用登入觸發程序。AUDIT_LOGIN 事件的事件通知則無法這麼做。
擷取登入觸發程序事件資料
若要擷取有關 LOGON 事件的 XML 資料,以用於登入觸發程序內部,請使用 EVENTDATA 函數。如需詳細資訊,請參閱<設計及實作結構化儲存體 (Database Engine)>。LOGON 事件會傳回下列事件資料結構描述:
<EVENT_INSTANCE>
<EventType>event_type</EventType>
<PostTime>post_time</PostTime>
<SPID>spid</SPID>
<ServerName>server_name</ServerName>
<LoginName>login_name</LoginName>
<LoginType>login_type</LoginType>
<SID>sid</SID>
<ClientHost>client_host</ClientHost>
<IsPooled>is_pooled</IsPooled>
</EVENT_INSTANCE>
<EventType>
包含 LOGON。<PostTime>
包含要求建立工作階段的時間。<SID>
包含所指定登入名稱的安全識別碼 (SID) 之 Base 64 編碼二進位資料流。<ClientHost>
包含建立連接的來源用戶端之主機名稱。如果用戶端和伺服器名稱相同,這個值會是 '<local_machine>'。否則會是用戶端的 IP 位址。<IsPooled>
如果是利用連接共用來重複使用連接,這會是 1。否則,這個值便為 0。
建立、修改和卸除登入觸發程序
登入觸發程序可以從任何資料庫建立,但會在伺服器層級註冊並儲存在 master 資料庫中。