はじめに
こんにちは!中途入社のなーがです。前回はデータベースユーザーのデフォルトスキーマを切り替えてみるという内容でしたが、今回はDockerで起動したSQL Serverの既定のデータベースを変更したユーザーでログインできなくなった場合の解決方法について書こうと思います。解決方法をすぐに知りたい方はこちらから確認できます。
前回のブログでDockerを使用した検証用環境を作成した際に、saの既定のデータベースを変更するという内容があったと思います。スキーマの設定を確認するためにTestDBの作成と削除を繰り返していたのですが、saの既定のデータベースをmasterからTestDBに変更したままTestDBを削除してしまったため、saでログインできなくなってしまいました。このとき作成していたのは検証用環境であったためコンテナごと作成しなおす事も出来たのですが、商用環境等で同じ状況に遭遇した場合に役立つと思い調べてみることにしました。
起こったこと
では、実際に作業を行ってみようと思います。まず、saの既定のデータベースを確認します。セキュリティ→ログインからsaをダブルクリックします。
saの既定のデータベースはmasterとなっています。
saの既定のデータベースをmasterからTestDBに変更します。
ALTER LOGIN sa WITH DEFAULT_DATABASE=TestDB;
先程と同様にsaのプロパティを確認すると、既定のデータベースがTestDBに変更されました。
それでは、TestDBを削除します。TestDBを右クリックし、「既存の接続を閉じる」にチェックを入れて「OK」をクリックします。
テストDBが削除されました。
saでログインしようとすると、アクセスに失敗してしまいます。
こちらの現象はDBを削除したときだけでなく、ログインユーザーのデフォルトデータベースに設定しているDB名を変更した際にも発生するようです。
解決方法
ターミナルからコンテナ内のsqlcmdを使用してsaでログインします。オプションdでmasterを指定しているとこがミソだと思います。
Dockerコンテナ上のSQL Serverにsqlcmdでアクセスする方法はMSの公式ドキュメントにも記載がありましたが、分かりやすかったこちらを参考にさせて頂きまました。また、sqlcmdを使用して既定のデータベースを変更する方法はこちらを参考にさせて頂きました。
docker exec -it コンテナ名 /opt/mssql-tools/bin/sqlcmd -U sa -P saのパスワード -d master
Alter loginでsaユーザーの既定のデータベースをmasterに戻します。
alter login sa with default_database=master
「GO」と入力してSQLを実行します。
「exit」と入力してsqlcmdを終了します。
saでログインしてみると、無事アクセスすることが出来ました!
さいごに
今回はDockerで起動したSQL Serverの既定のデータベースを変更したユーザーでログインできなくなった場合の解決方法について書きました。既定のデータベースを変更するとはあまりないと思いますが、初見では対処に困ると思います。これからも業務中に学んだことをブログにしていきたいと思います。