Share via


登入觸發程序

新增: 2006 年 12 月 12 日

登入觸發程序會引發預存程序來回應 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 函數。如需詳細資訊,請參閱<使用 EVENTDATA 函數>。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>

包含建立連接的來源用戶端之主機名稱。如果用戶端和伺服器名稱相同,這個值會是 '&lt;local_machine&gt;'。否則會是用戶端的 IP 位址。

<IsPooled>

如果是利用連接共用來重複使用連接,這會是 1。否則,這個值便為 0

建立、修改和卸除登入觸發程序

登入觸發程序可以從任何資料庫建立,但會在伺服器層級註冊並儲存在 master 資料庫中。

建立登入觸發程序
修改登入觸發程序
卸除登入觸發程序

取得有關登入觸發程序的資訊

您可以查詢 sys.server_triggers 目錄檢視,檢視登入觸發程序的中繼資料。

請參閱

概念

登入觸發程序執行方針
瞭解 DDL 觸發程序與 DML 觸發程序
設計與建立資料庫

說明及資訊

取得 SQL Server 2005 協助