次の方法で共有


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 にログインできるように、ログイン トリガーを削除または無効にすることもできます。

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

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

    SQL Server で 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 で説明されているのと同じ修復手段を実行できます。

      Note

      上記の手順では、SA または同等の管理者アカウントが必要です。

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

詳細

ログオン トリガーが失敗するもう 1 つの状況は、EVENTDATA 関数を使用している場合です。 この関数により、XML が返され、大文字と小文字が区別されます。 そのため、IP アドレスに基づいてアクセスをブロックすることを目的として、次のログオン トリガーを作成すると、この問題が発生するおそれがあります。

 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

ユーザーが、トリガーのこの部分にインターネットからこのスクリプトをコピーする場合に、大文字と小文字を区別しませんでした。

 SELECT EVENTDATA().value ( '(/event_instance/clienthost)[1]' , 'NVARCHAR(15)');

その結果、EVENTDATA により常に NULL が返され、SA と同等のすべてのログインのアクセスが拒否されました。 この場合、DAC 接続が有効になっていなかったため、上記のスタートアップ パラメーターを使用してサーバーを再起動し、トリガーを削除する以外に選択肢はありませんでした。