登入觸發程式會在登入事件發生時執行預存程序。 當使用者與 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 追蹤事件,這可用於 事件通知。 觸發程式和事件通知之間的主要差異在於觸發程式會與事件同步引發,而事件通知則是異步的。 例如,這表示如果您想要停止建立會話,則必須使用登入觸發程式。 AUDIT_LOGIN事件上的事件通知無法用於此目的。
指定第一個和最後一個觸發程式
您可以在 LOGON 事件上定義多個觸發程式。 在事件中,任何一個觸發程式都可以使用 sp_settriggerorder 系統預存程序來指定為第一個或最後一個觸發程式。 SQL Server 不保證其餘觸發程式的執行順序。
管理交易
在 SQL Server 引發登入觸發程式之前,SQL Server 會建立與任何使用者交易無關的隱含交易。 因此,當首次登入觸發器開始啟動時,交易計數為 1。 在所有登入觸發程式完成執行之後,交易就會提交。 如同其他類型的觸發程式,如果登入觸發程式以交易計數 0 完成執行,SQL Server 會傳回錯誤。 ROLLBACK TRANSACTION 語句會將交易計數重設為 0,即使語句是在巢狀交易內發出也一樣。 COMMIT TRANSACTION 可能會將交易計數遞減為 0。 因此,我們建議不要在登入觸發程式內發出 COMMIT TRANSACTION 語句。
當您在登入觸發程式內使用 ROLLBACK TRANSACTION 語句時,請考慮下列事項:
在 ROLLBACK TRANSACTION 點之前所做的任何資料變更都將被復原。 這些修改包括目前觸發程式所做的修改,以及先前在相同事件上執行的觸發程式所做的修改。 不會執行特定事件的任何剩餘觸發程式。
目前的觸發程式會繼續執行 ROLLBACK 語句之後出現的任何剩餘語句。 如果其中任何一個語句修改數據,這些修改不會被回復。
如果在 LOGON 事件上執行觸發程式時發生下列任一情況,則不會建立使用者會話:
原始隱含交易會回復或失敗。
觸發程式主體內引發嚴重性大於 20 的錯誤。
停用登入觸發程式
登入觸發程式可以有效地防止所有使用者(包括sysadmin固定伺服器角色的成員)成功連線到資料庫引擎。 當登入觸發程式防止連線時,固定伺服器角色的成員 sysadmin 可以使用專用的系統管理員連線,或以最低組態模式啟動 Database Engine 來連線(-f)。 如需詳細資訊,請參閱 Database Engine 服務啟動選項。
相關工作
| 任務 | 主題 |
|---|---|
| 描述如何建立登入觸發程式。 登入觸發程式可以從任何資料庫建立,但會註冊在伺服器層級,並位於 master 資料庫中。 | 創建觸發器 (Transact-SQL) |
| 說明如何修改登入觸發機制。 | ALTER TRIGGER (Transact-SQL) |
| 描述如何刪除登入觸發程式。 | DROP TRIGGER (Transact-SQL) |
| 描述如何傳回有關登入觸發事件的相關資訊。 |
sys.server_triggers (Transact-SQL) sys.server_trigger_events (Transact-SQL) |
| 描述如何擷取登入觸發程式事件數據。 |