web-dev-qa-db-ja.com

SQL Server 2017 LocalDB共有インスタンスに接続できないのはなぜですか?

だから私は過去数日間これに苦労してきました。 SQL Server 2017(14.0.1000.169)LocalDB共有インスタンスに接続できません。私はなぜネット全体を検索して読んでいましたが、うまくいった答えを見つけることができませんでした。

以前にSQL Server Expressや、すべてアンインストールしたものがあったラップトップを試してみました。また、新しいWin10 VM上でも。

両方に常に同じエラーがあります:

Sqlcmd:エラー:Microsoft ODBC SQL Serverのドライバー17:名前付きパイププロバイダー:SQL Server [2]への接続を開けませんでした。

Sqlcmd:エラー:Microsoft ODBC SQL Serverのドライバー17:ログインタイムアウトの期限が切れました.

Sqlcmd:エラー:Microsoft ODBC Driver 17 for SQL Server:SQL Serverへの接続を確立中にネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないか、アクセスできません。インスタンス名が正しく、SQL Serverがリモート接続を許可するように構成されている場合詳細については、SQL Server Books Onlineを参照してください。

このエラーはSQLCMDによるものですが、SSMSまたはビジュアルスタジオの接続文字列でも試しました。

インスタンスの所有者と接続しようとしましたが、接続できませんでした。また、sysadmin権限を持つSQLログインで試行しましたが、できませんでした。

パイプ名でのみ接続できます。

私もこれらのリンクからすべてを試しました

https://stackoverflow.com/questions/10214688/why-cant-i-connect-to-a-sql-server-2012-localdb-shared-instance

そして

https://social.msdn.Microsoft.com/Forums/sqlserver/en-US/1257bf26-6ab0-416d-bf26-34f128f42248/sql-2016-sp1-sqllocaldb-versions-errors-with-quotwindows- api-call-quotreggetvaluewquot?forum = sqlexpress

接続できないのはなぜですか?

5
Leojet

LocalDb v2017以降のバグのようです。 v2012 SP4以降、使用可能なすべてのバージョンをテストしました。 v2016 SP2までは、フレンドリ共有名"(localdb)\.\SHAREDNAME"が接続リクエストで受け入れられます。 v2017以降を使用する場合、リクエストの結果は常に「インスタンスが見つかりません」エラーになります。

インストールされているすべてのLocalDbバージョンをsqllocaldb.exe vでクエリすると、v2016以降でエラーメッセージが表示されることも確認しました。

Windows API呼び出し「RegGetValueW」がエラーコードを返しました:0。

この動作が元の問題にリンクされているかどうかは不明です。


[〜#〜]更新[〜#〜]

質問にリンクされているレジストリ修正を適用すると、バージョンクエリが解決されます。

もう少し掘り下げた後、接続障害の原因を発見したと思います。 SQLLocalDbv2016までがローカルマシンにインストールされている場合、共有機能は次のように機能します。

レジストリで、新しいキーがComputer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server Local DB\Shared Instances\{SharedName}に作成されます。このキーには、次のスクリーンショットに示すように、パイプ名を格納する文字列値InstanceNameが含まれています。

enter image description here

対応するインスタンスが開始されると、常にこのパイプ名が選択されます。名前は永続的なままです。つまり、インスタンスが再起動すると、パイプ名が再利用されます。

このロジックは、LocalDbv2017以降がインストールされると破棄されます。共有名のインスタンスが開始されると、レジストリのパイプ名は無視されます。代わりに、sqllocaldb i {instance}を介してインスタンスをクエリすると、完全に異なるパイプ名が表示されます。

これはおそらく、パイプ名が一致しないために接続を確立できない理由でもあります。レジストリ値を編集して実際のパイプ名と一致させると、問題は解決しますが、インスタンスが再起動されるまでのみです。

2
Aurora