免責事項
この記事は個人メモとして書き留めておいたものを、分かりやすく纏めてみたものです。記事内容に間違い・補足事項等の指摘があれば適宜修正したいと思いますが、記事の内容を100%保証するものではありません。予めご了承ください。
はじめに
SQLServerのセットアップ時、SQL Server Browser はデフォルトで無効の状態となるようになりました。(だいぶ昔からかもしれませんが。)
「社内などでも他部署のSQLServerが自動検出されてしまう」ため、セキュリティの観点から推奨されないようになったのかと思います。
ただし、これにより異なる端末やツールなどからうまく繋がらなかったりするケースが出てしまいました。(2017年当時)ネットで調べても詳細な情報をうまく見つけられなかったため、一時期、やむを得ずSQL Server Browserを有効にして運用していたこともありました。
■「SQLServerBrowser」を起動せず、外部から接続する方法
①構成ツール(バージョンによって呼び方が違う場合があります)にてTCP/IPを有効にする
②TCP/IPプロパティの、IPALLにて、
●TCPポートを指定(製品版のデフォルトは1433、Expressはたぶん空白)
※任意の番号でよいが、80番などはIISが使用したりするため、他とバッティングしないもの
●TCP動的ポートを空白にする(使用しない設定)を設定する
③接続するときには、
・IPなどの後に「,(ポート番号)」を指定して接続する(1433のみ省略可能な場合がある)
・インスタンス名は指定してもしなくても良い
× TEST\SQLEXPRESS
× 192.168.1.1\SQLEXPRESS
○ TEST,1234
○ 192.168.1.1,1234
○ TEST\SQLEXPRESS,1234
○ 192.168.1.1\SQLEXPRESS,1234
OKな例
cf. MSサイトの接続文字列説明
■罠に陥りやすいケースについて
・SQLEXPRESS版をインストールして、インスタンス名称がSQLEXPRESS
・サーバー名はAAA(host記載かDNS解決)
・ポートは静的指定で、1433
この場合、接続可否は下記になります
○ AAA
× AAA\SQLEXPRESS
○ AAA,1433
○ AAA\SQLEXPRESS,1433
インスタンス名が指定されているのに、ポート番号の指定がない場合は、
SQL Server Browserに確認しにいきます。
結果、サービスが起動していない場合は、接続に失敗します。
→サーバー側でポート1433に設定してあっても、
省略可能なポートという判定にはならないため、
そもそものポート1433での接続を試行せず、結果、失敗する。
■解説とまとめ
テスト検証での挙動からの推測を多分に含みます
・インスタンス名が指定された場合、デフォルトポートではないと判断するため、SQL Server Browserにどのポート番号でサービスが提供されているか確認しにいきます。
・ただしポート番号が指定された場合は、SQL Server Browserに照会しにいきません。(する必要がなくなる。)
・静的ポートではなく動的ポートの場合は、サービス再起動のたびにポート番号が変動するため、SQL Server Browserサービスの起動は必須となります。
→ インスタンス名から、今回はどのポートで起動したのかを確認する
すごく乱暴な言い方をすれば、SQLServerのインスタンス名は、
接続するポート番号を調べるための役割くらいしか、意味がないかもしれません。
DNSの枠組みで例えれば、
ホスト名 → SQLServerインスタンス名
DNSサーバー → SQL Server Browserサービス
IPアドレス → ポート番号
といった感じです。
もしIPアドレスを知っていれば、○○さんのPC名は知らなくても、共有フォルダにアクセスできますよね。(DNSの場合)
ポート番号さえ知っていれば、特定のSQLServerインスタンスに、そのインスタンス名を知らなくても!、アクセスできます。(SQLServerの場合)
まあ、でも「番号」での管理(番号を覚えるの)はナンセンスなので、「名前」が用意されたんですね。
もしたくさんのサーバーに名前がなくて、IP設定だけだったら・・・ということですね。