ITエンジニアの成長ブログ

ITエンジニアとして行う勉強の発信&日々の生活で体験した楽しいことをゆるく発信

【SQL Server】固定サーバーロールsysadminのユーザーは、既定のスキーマの設定が無視される

今回は、SQL Serverの固定サーバーロール「sysadmin」のユーザーは、既定のスキーマの設定が無視されることについて、個人的な備忘としてメモを残しておきます。

既定のスキーマの設定について

SQL Serverのデータベースユーザーは、既定のスキーマと呼ばれる設定を行うことができます。

これは、あるオブジェクトにアクセスする際にスキーマを指定しなかった場合にデフォルトで検索されるスキーマのことで、設定することで便利にテーブルへアクセスすることができるようになります。

たとえば、以下は「AdventureWorks2016」のデータベースユーザーtaroの既定のスキーマは「Person」になっています。

ユーザーtaroの既定のスキーマの設定

この場合、Personスキーマ配下のテーブルはスキーマを指定せずにアクセスすることができます。

Person.Addressにスキーマ指定なしでアクセスしている様子

固定サーバーロールsysadminのメンバーに追加するとどうなるか

上記のユーザーtaroを、固定サーバーロールsysadminのメンバーに追加するとどうなるでしょうか。以下の通り設定をします。
(ここでは「AdventureWorks2016」のデータベースユーザーtaroは、ログインtaroに紐づいている前提です)

ログインユーザー「taro」に固定サーバーロール「sysadmin」を付与

上記設定後、再度Person.Addressにスキーマ指定なしでアクセスしてみましょう。すると、以下の通りオブジェクト名が無効である旨のエラーとなってしまいました。

Person.Addressにスキーマ指定なしでアクセスしてエラー

スキーマ指定なしでアクセスするとエラーになりますが、スキーマを付与してアクセスすると問題なくアクセスできます。

Person.Addressにスキーマ指定ありでアクセスしている様子

このように、ログインユーザーに固定サーバーロールsysadminのメンバーを追加すると既定のスキーマの設定が無視されてしまいます。

調べてみると、Microsoft公式のALTER USERのページにしっかりと記載されていました。
ALTER USER (Transact-SQL) - SQL Server | Microsoft Learn

記載個所を以下に抜粋しますが、既定のスキーマは無視されることになり、dboが既定のスキーマとして割り当てられるようになるようです。

固定サーバーロール「sysadmin」を付与したときの挙動について

おわりに

いかがでしょうか。権限の設定が面倒なので、ローカル環境ではユーザーにsysadmin固定サーバーロールを付与することがあるかもしれませんが、このような挙動になることは頭の片隅に入れておいた方が良さそうです。

今回はこの辺で失礼いたします。最後までお読みいただきありがとうございました。