今回は、SQL Serverの固定サーバーロール「sysadmin」のユーザーは、既定のスキーマの設定が無視されることについて、個人的な備忘としてメモを残しておきます。
既定のスキーマの設定について
SQL Serverのデータベースユーザーは、既定のスキーマと呼ばれる設定を行うことができます。
これは、あるオブジェクトにアクセスする際にスキーマを指定しなかった場合にデフォルトで検索されるスキーマのことで、設定することで便利にテーブルへアクセスすることができるようになります。
たとえば、以下は「AdventureWorks2016」のデータベースユーザーtaroの既定のスキーマは「Person」になっています。
固定サーバーロールsysadminのメンバーに追加するとどうなるか
上記のユーザーtaroを、固定サーバーロールsysadminのメンバーに追加するとどうなるでしょうか。以下の通り設定をします。
(ここでは「AdventureWorks2016」のデータベースユーザーtaroは、ログインtaroに紐づいている前提です)
上記設定後、再度Person.Addressにスキーマ指定なしでアクセスしてみましょう。すると、以下の通りオブジェクト名が無効である旨のエラーとなってしまいました。
スキーマ指定なしでアクセスするとエラーになりますが、スキーマを付与してアクセスすると問題なくアクセスできます。
このように、ログインユーザーに固定サーバーロールsysadminのメンバーを追加すると既定のスキーマの設定が無視されてしまいます。
調べてみると、Microsoft公式のALTER USERのページにしっかりと記載されていました。
ALTER USER (Transact-SQL) - SQL Server | Microsoft Learn
記載個所を以下に抜粋しますが、既定のスキーマは無視されることになり、dboが既定のスキーマとして割り当てられるようになるようです。
おわりに
いかがでしょうか。権限の設定が面倒なので、ローカル環境ではユーザーにsysadmin固定サーバーロールを付与することがあるかもしれませんが、このような挙動になることは頭の片隅に入れておいた方が良さそうです。
今回はこの辺で失礼いたします。最後までお読みいただきありがとうございました。