コマンドラインで SQL Server ベースの環境に接続するためのツールとしては従来の sqlcmd の他に、Go 言語を使用して作成されている go-sqlcmd があります。
go-sqlcmd は 従来の sqlcmd の同様のクエリを実行する機能 が含まれています。この機能のほかに、Use sqlcmd to create local SQL Server and Azure SQL Edge instances で解説されている SQL Server のコンテナーを作成する機能を使用することができます。
コンテナーの作成をするとユーザープロファイルのディレクトリに「.sqlcmd\sqlconfg」というファイルが作成されるのですが、このファイルの設定が影響して、go-sqlcmd の動作が従来の動作とは変わる可能性があります。
初期状態の動作
sqlconfig が存在しない初期状態では、-S / -U オプションを指定すると、次のようにパスワードの入力プロンプトが表示されます。
go-sqlcmd は「-P」オプションが 廃止 されているためコマンドラインオプションでパスワードを指定することができません。
-P
スイッチが削除されました。 SQL Server 認証のパスワードは、次のメカニズムでのみ指定できます。
SQLCMDPASSWORD
環境変数:CONNECT
コマンド- メッセージが表示されたら、ユーザーはパスワードを入力して接続を完了できます
環境変数 SQLCMDPASSWORD の設定かパスワードのプロンプトで明示的に入力する必要があります。
初期状態であれば、「-U」オプションを指定し、環境変数が設定されていない場合は次のようにパスワードの入力プロンプトが表示されます。
go-sqlcmd の特徴
go-sqlcmd は次世代の sqlcmd となり、次のような特徴があります。
- ODBC ドライバーとの依存関係がなくなる
- 従来の sqlcmd は ODBC ドライバー経由での接続が行われていた
- go-sqlcmd は、go-mssqldb でアクセスが行われるようになった
- go-mssqldb は元になったドライバーを Microsoft が Fork したものを使用 (今後は MS がメンテするんですかね)
- シングルバイナリで動作
- 単一ファイルで動作
- AAD 認証のオプションが強化
- 従来の sqlcmd でも「-G」オプションで AAD 認証を使用することができたが、サポートされる認証方式が強化されている
これらは、従来の sqlcmd で実現できていた機能ですが、これ以外に冒頭で記載した SQL Server or Azure SQL Edge のコンテナーを作成することができる機能 (「sqlcmd create mssql –accept-eula」) が追加されています。
この機能で作成された開発環境に接続を行うためのコンテキストについては、「ユーザープロファイルの .sqlcmd/sqlconfig」ファイルに保存されます。
コンテキストについては、コンテナー作成時への利用だけでなく、「sqlcmd config」で context / endpoint / user を使用することで任意の情報を作成することが可能となっています。
「-U」オプションを指定してもパスワードダイアログが表示されなくなるケース
発生する問題
問題となるのが、「sqlcmd create」でコンテナーの作成を行う / 「sqlcmd config」を実行し sqlconfig が作成されている状態での go-sqlcmd の実行です。
先ほどと同様のコマンドを実行するとパスワードの入力プロンプトが表示されなくなります。環境変数 SQLCMDPASSWORD を指定しても同様の挙動となり、環境変数にパスワードを設定してもログインができなくなります。
問題の原因
この動作ですが、sqlconfig ファイルで、currentcontext が設定されている場合、設定されているコンテキストのパワードを使用して、ログインが行われているようです。
この状態では環境変数で SQLCMDPASSWORD を設定しても、ログインで使用するパスワードはコンテキストに設定されているパスワードから上書きされず、コンテキストのパスワードが優先的に使用されるようです。
解決方法
この状態を解消させるためには、次のいずれかの方法をとることができます。
- 環境変数 SQLCMDUSER を指定する
- sqlconfig ファイルの currentcontext を削除する
どちらの方法も currentcontext の資格情報を使用しないという方法につながるのですが、お薦めとなるのは「1.」の方法となるようです。
環境変数の SQLCMDUSER に -U で指定するログインを設定することで、sqlconfig の currentcontext が設定される前と同等の動作に切り替えることができました。
go-sqlcmd を使用していて、 -U に指定したログインのパスワードを入力しても、ログインができない場合は、sqlconfig の設定の存在を覚えておくとよいのではないでしょうか。
「sqlcmd config get-contexts」を実行して、現在の実行ではどのコンテキストがデフォルトで使用される状態になっているかを意識することも重要そうですね。