登入觸發程序
登入觸發程序會引發預存程序來回應 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 追蹤事件,該事件可用於 事件通知。 觸發程序與事件通知的主要差別在於,觸發程序會與事件同步引發,而事件通知則是非同步的。 這表示如果不要建立工作階段,就必須使用登入觸發程序。 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,包括固定伺服器角色的成員 sysadmin
。 當登入觸發程式防止連線時,固定伺服器角色的成員 sysadmin
可以使用專用的系統管理員連線,或以最小組態模式啟動 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) |
描述如何擷取登入觸發程序事件資料。 |