ログオン トリガー

ログオン トリガーは、LOGON イベントに応答してストアド プロシージャを起動します。このイベントは、SQL Server インスタンスでユーザー セッションが確立されるときに発生します。ログオン トリガーは、ログインの認証段階が終了した後、ユーザー セッションが実際に確立されるまでの間に発生します。したがって、通常、エラー メッセージや PRINT ステートメントからのメッセージはユーザーに通知されますが、このトリガー内で発生したすべてのメッセージは SQL Server のエラー ログに記録されます。認証に失敗した場合は、ログオン トリガーが作動しません。

ログオン トリガーを使用すると、ログインの利用状況を追跡したり、SQL Server へのログインを制限したり、特定のログインのセッション数を制限したりすることで、サーバー セッションを監査し制御できます。たとえば、次のコードでは、ログイン login_test によってユーザー セッションが既に 3 つ生成されている場合、ログオン トリガーは、そのログインが開始する 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 イベントのイベント通知を使用できません。

ログオン トリガーの無効化

ログオン トリガーでは、sysadmin 固定サーバー ロールのメンバーを含むすべてのユーザーがデータベース エンジンに接続できないようにすることができます。ログオン トリガーによって接続が阻止された場合、sysadmin 固定サーバー ロールのメンバーは、専用管理者接続を使用するか、データベース エンジンを最小構成モード (-f) で起動することによって接続できます。詳細については、「SQL Server Management Studio で専用管理者接続を使用する方法」および「SQL Server サービスのスタートアップ オプションの使用」を参照してください。

ログオン トリガーのイベント データのキャプチャ

ログオン トリガー内で使用するために LOGON イベントに関する XML データをキャプチャするには、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>
    指定されたログイン名のセキュリティ ID 番号 (SID) の Base 64 エンコード形式のバイナリ ストリームを格納します。

  • <ClientHost>
    接続を確立したクライアントのホスト名を格納します。クライアントとサーバーの名前が同じ場合、この値は '&lt;local_machine&gt;' になります。これらの名前が異なる場合、この値はクライアントの IP アドレスになります。

  • <IsPooled>
    接続プールを使用して接続が再利用される場合は 1 になります。それ以外の場合は 0 になります。

ログオン トリガーの作成、変更、および削除

ログオン トリガーは、どのデータベースからでも作成できますが、サーバー レベルで登録されるため master データベースに存在します。

ログオン トリガーを作成するには

ログオン トリガーを変更するには

ログオン トリガーを削除するには

ログオン トリガーに関する情報の取得

ログオン トリガーに関するメタデータを表示するには、sys.server_triggers カタログ ビューにクエリを実行します。