ログオン トリガー
ログオン トリガーは、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>
接続を確立したクライアントのホスト名を格納します。クライアントとサーバーの名前が同じ場合、この値は '<local_machine>' になります。これらの名前が異なる場合、この値はクライアントの IP アドレスになります。<IsPooled>
接続プールを使用して接続が再利用される場合は 1 になります。それ以外の場合は 0 になります。
ログオン トリガーの作成、変更、および削除
ログオン トリガーは、どのデータベースからでも作成できますが、サーバー レベルで登録されるため master データベースに存在します。