次の方法で共有


MSSQLSERVER_17892

適用対象:SQL Server

詳細

属性
製品名 SQL Server
イベント ID 17892
イベント ソース MSSQLSERVER
コンポーネント SQLEngine
シンボル名 SRV_LOGON_FAILED_BY_TRIGGER
メッセージ テキスト トリガーの実行により、ログイン <Login Name> のログオンに失敗しました。

説明

エラー 17892 は、ログオン トリガー コードを正常に実行できない場合に発生します。 ログオン トリガーは、LOGON イベントに応答してストアド プロシージャを起動します。 このイベントは、SQL Server インスタンスでユーザー セッションが確立されるときに発生します。 次のエラー メッセージがユーザーに報告されます。

メッセージ 17892、レベル 14、状態 1、サーバー <サーバー名>、行 1
トリガーの実行により、ログイン <Login Name> のログオンに失敗しました。

考えられる原因

この問題は、その特定のユーザー アカウントのトリガー コードの実行時にエラーが発生した場合に発生するおそれがあります。 次のようなシナリオが考えられます。

  • トリガーは、存在しないテーブルにデータを挿入しようとします。
  • ログオン トリガーによって参照されるオブジェクトに対するアクセス許可がログインにない場合。

ユーザー アクション

シナリオに応じて、次のいずれかの解決策を使用できます。

  • シナリオ 1: 現在、管理者アカウントで SQL Server への開いているセッションにアクセスできます

    この場合は、トリガー コードを修正するために必要な修正措置を講じることができます。

    • 例 1: トリガー コードによって参照されるオブジェクトが存在しない場合は、ログイン トリガーを正常に実行できるように、そのオブジェクトを作成します。

    • 例 2: トリガー コードによって参照されるオブジェクトが存在するが、ユーザーにアクセス許可がない場合は、オブジェクトにアクセスするために必要な権限を付与します。

    または、ユーザーが引き続き SQL Server にログインできるように、ログイン トリガーを削除または無効にすることもできます。

ログオン トリガーの管理

サーバー上のすべてのログオン トリガーを一覧表示します。

SELECT name, is_disabled, create_date, modify_date
FROM sys.server_triggers
WHERE type_desc = 'LOGON';

ログオン トリガーを削除せずに一時的に無効にします。

DISABLE TRIGGER trigger_name ON ALL SERVER;

ログオン トリガーを完全に削除 (削除):

DROP TRIGGER trigger_name ON ALL SERVER;

詳細については、「 トリガーセキュリティの管理」を参照してください。

  • シナリオ 2: 管理者特権で開かれている現在のセッションはありませんが、SQL Server で専用管理者接続 (DAC) が有効になっています。

    この場合、DAC 接続を使用して、シナリオ 1 で説明したのと同じ手順を実行できます。 ログオン トリガーは DAC 接続には影響しません。 DAC 接続の詳細については、「データベース管理者の Diagnostic 接続を参照してください。

    DAC が有効になっているかどうかを確認するには、SQL Server エラー ログを確認します。 次の例のようなメッセージを探します。

    2020-02-09 16:17:44.150 ポート 1434 でローカルにリッスンするため、専用管理者接続のサポートが確立されました。

  • シナリオ 3: DAC がサーバーで有効になっていないこと、および SQL Server への既存の管理者セッションがない。

    このシナリオで問題を修復する唯一の方法は、次の手順を行うことです。

    1. SQL Server および関連サービスを停止します。

    2. スタートアップ パラメーター -c、および-mを使用して-fコマンド プロンプトから SQL Server を起動します。 このアクションにより、ログイン トリガーが無効になり、シナリオ 1 で説明したのと同じ修復メジャーを実行できます。

      この手順には、システム管理者 (SA) または同等の管理者アカウントが必要です。

      これらのスタートアップ オプションとその他のスタートアップ オプションの詳細については、「データベース エンジン サービスのスタートアップ オプション」を参照してください。

詳細

EVENTDATA関数を誤って使用すると、ログオン トリガーが失敗する可能性もあります。 EVENTDATA関数は XML を返し、大文字と小文字が区別されます。 たとえば、次のログオン トリガーを作成して IP アドレスに基づいてアクセスをブロックすると、XML パスの大文字と小文字が正しくない場合にエラー 17892 が発生する可能性があります。

 CREATE TRIGGER tr_logon_CheckIP  
 ON ALL SERVER  
 FOR LOGON  
 AS
 BEGIN
  IF IS_SRVROLEMEMBER ( 'sysadmin' ) = 1  
     BEGIN
         DECLARE @IP NVARCHAR ( 15 );  
         SET @IP = ( SELECT EVENTDATA ().value ( '(/EVENT_INSTANCE/ClientHost)[1]' , 'NVARCHAR(15)' ));  
         IF NOT EXISTS( SELECT IP FROM DBAWork.dbo.ValidIP WHERE IP = @IP )  
         ROLLBACK ;  
     END ;  
 END ;  
 GO

このスクリプトをコピーするときに、特にトリガーのこの部分で適切な大文字と小文字の区別を維持しないと、トリガーは失敗します。

-- Incorrect: lowercase 'event_instance' and 'clienthost' will cause EVENTDATA to return NULL
 SELECT EVENTDATA().value ( '(/event_instance/clienthost)[1]' , 'NVARCHAR(15)');

その結果、 EVENTDATA は常に NULL を返し、すべての SA と同等のログインはアクセスを拒否されます。 この場合、DAC 接続が有効になっていない場合は、前に説明したスタートアップ パラメーターを使用してサーバーを再起動してトリガーを削除する必要があります。