登入觸發程序

適用于:SQL Server Azure SQL 受控執行個體不支援Azure Synapse分析平臺系統 (PDW)

登入觸發程序會引發預存程序來回應 LOGON 事件。 建立使用者會話時會引發此事件,且實例為 SQL Server。 登入觸發程序會在登入驗證階段結束之後,但在使用者工作階段實際建立之前引發。 因此,源自觸發程式內的所有訊息通常會觸達使用者,例如來自 PRINT 語句的錯誤訊息和訊息,都會改用至SQL Server錯誤記錄檔。 如果驗證失敗,登入觸發程序就不會引發。

您可以使用登入觸發程式來稽核和控制伺服器會話,例如追蹤登入活動、限制登入SQL Server,或限制特定登入的會話數目。 例如,在下列程式碼中,如果登入已建立三個使用者會話,登入觸發程式會拒絕登入嘗試SQL Server由登入起始login_test

USE master;  
GO  
CREATE LOGIN login_test WITH PASSWORD = N'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 N'login_test'  
FOR LOGON  
AS  
BEGIN  
IF ORIGINAL_LOGIN()= N'login_test' AND  
    (SELECT COUNT(*) FROM sys.dm_exec_sessions  
            WHERE is_user_process = 1 AND  
                original_login_name = N'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 的錯誤。

停用登入觸發程序

登入觸發程式可以有效地防止所有使用者成功連線到 Database Engine,包括 系統管理員 固定伺服器角色的成員。 當登入觸發程式防止連線時, 系統管理員 固定伺服器角色的成員可以使用專用的系統管理員連線來連線,或是以最小組態模式啟動 Database Engine, (-f) 。 如需詳細資訊,請參閱 Database Engine Service Startup Options

Task 主題
描述如何建立登入觸發程序。 登入觸發程序可以從任何資料庫建立,但會在伺服器層級註冊並儲存在 master 資料庫中。 CREATE TRIGGER (Transact-SQL)
描述如何修改登入觸發程序。 ALTER TRIGGER (Transact-SQL)
描述如何刪除登入觸發程序。 DROP TRIGGER (Transact-SQL)
描述如何傳回有關登入觸發程序的詳細資訊。 sys.server_triggers (Transact-SQL)

sys.server_trigger_events (Transact-SQL)
描述如何擷取登入觸發程序事件資料。

另請參閱

DDL 觸發程序