共用方式為


登入觸發程序

登入觸發程序會引發預存程序來回應 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>
    包含建立連接的來源用戶端之主機名稱。如果用戶端和伺服器名稱相同,這個值會是 '&lt;local_machine&gt;'。否則會是用戶端的 IP 位址。

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

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

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

建立登入觸發程序

修改登入觸發程序

卸除登入觸發程序

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

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