web-dev-qa-db-ja.com

ログインにSQL Serverの接続エンドポイント権限がありません-エラー18456、状態:149

SQL Server Management Studioを介して接続し、通常の操作を実行できる、セットアップした新しいデータベースがあります。アプリケーションで使用するために作成した2つのアカウントがあり、どちらもSSMS経由でログインできます。私のプログラムはJavaで 'mssql-jdbc-6.4.0.jre8.jar'ドライバーを使用して実行しています。接続しようとすると、データベースログに次のエラーが表示されます。

エラー:18456、重大度:14、状態:149ユーザー 'application_read_only_user'のログインに失敗しました。理由:ログインベースのサーバーアクセス検証がインフラストラクチャエラーで失敗しました。ログインに接続エンドポイントの権限がありません。 [クライアント:127.0.0.1]

私はこの問題を解決しようとするいくつかの情報源を見てきました。 Microsoftの公式ドキュメントには、州149が記載されていないようで、オンラインで見つけた結果も記載されていません。

エンドポイントを元の設定から変更していないため、次のアイテムしかありません。

  • 専用管理接続
  • TSQLローカルマシン
  • TSQL名前付きパイプ
  • TSQLデフォルトTCP
  • TSQLデフォルトVIA

SQL Serverサービスをローカルシステムとして実行するように設定してみました。

このサイトには同様の質問がたくさんあり、スタックオーバーフローがありますが、どれも助けになりませんでした。それらはすべて異なる状態を持っているか、状態をリストしていません。

3
Seb

私は最終的にこの問題を解決することができました。デフォルトでは、インストール後、TCP/IP接続は無効になっています。 「SQL Server構成マネージャー」を開き、ネットワーク構成セクションに移動してTCP/IPを有効にする必要がありました。

TCP/IPの[IPアドレス]メニューで、IP4オプションがアクティブであること、およびIPAllポートがサーバーがリッスンしていると予想したものと一致していることも確認する必要がありました。

hot2useの回答には、問題を解明するための潜在的に有用なオプションがたくさんありましたが、結局、それらのどれも私の正確な問題を診断できませんでした。サーバー自体のクエリから返されたすべての結果は、すべてが正しく機能していることを示していました。このツールを調べて初めて、一部の設定が期待どおりになっていないことがわかりました。

1
Seb

分析

Error 18456を検索すると、最終的にAaron Bertrandから次のブログ投稿が見つかります。

states 146...149の次のリスト:

これらの状態は、上記の状態11と12を置き換えますが、SQL Server 2016以降のみです。目的は、sysadminがSQL認証とWindows認証のログイン間、および接続とエンドポイントのアクセス許可の間で診断できるように、実際の根本的な問題を容易にすることでした(すべて、ログインしようとしているユーザーに詳細情報を提供しません)。詳細は この投稿 の後半をご覧ください。

上記の引用のthis postリンクは記事を参照しています "ログイン失敗のインフラストラクチャエラーが発生するのはなぜですか?" 以上CSS SQL Server Engineersブログ/サイト。

この記事では、「インフラストラクチャエラーにより、ログインベースのサーバーアクセス検証に失敗しました」の原因として、次の2つの理由が挙げられています。

  1. ログインには、このサーバーインスタンスのCONNECT SQLという名前のSERVERクラス権限がありますか?

  2. ログインには、クライアントアプリケーションが接続を確立した特定のエンドポイントに対するCONNECTという名前のENDPOINTクラス権限がありますか?

SQL Server 2016+にはレベル146 ... 149エラーの新しいエラーメッセージがあるため、特定のエラーメッセージが表示されますログインに接続エンドポイントがありません許可。(レベル149)、これは上から2番目のオプションに移動します。

次のスクリプトを使用して、現在のenpoint権限を確認してください。

SELECT * FROM sys.server_permissions AS sp2 
    JOIN sys.server_principals AS sp
        ON sp2.grantee_principal_id = sp.principal_id
    LEFT OUTER JOIN sys.endpoints AS e
        on sp2.major_id = e.endpoint_id
WHERE sp2.permission_name = 'CONNECT' 
AND sp2.class_desc = 'ENDPOINT'

GRANTpublicおよびTSQL Default TCPの組み合わせには、少なくとも1つのエントリが必要です

解決

TCPのSQL ServerログインのENDPOINTのCONNECT権限を確認するか、単にアカウントに権限を付与します。

GRANT CONNECT ON ENDPOINT::[TSQL Default TCP] TO public;

(特定のアカウントにその権限を割り当てるだけの場合は、public<SQL Server Login>に置き換えます)

エンドポイントのリストを表示するには、次を実行します。

select * from sys.endpoints

さらに読む/リファレンスリスト

2