trapemiyaの日記

hatenablogが新しくなったんで新規一転また2019年1月からちょこちょこ書いてます。C#中心のプログラミングに関するお話です。

SQL Server スキーマ名を省略したらアクセスできなくなった

以下のような簡単なSQLがアクセス出来なくなった。

select * from テーブルA

「オブジェクト名 'テーブルA' は無効です。」といったエラーが出る。

以下のようにスキーマ名を付けるとちゃんとアクセスできる。

select * from hoge.テーブルA

もちろん、アクセスしているユーザーは、hogeスキーマをデフォルトにしている。
悩んでネットを探すと、答えが簡単に見つかった。感謝!

結論から言えば、SQL Serverにアクセスしてるユーザーが、「SysAdmin」サーバーロールに属しているのが原因だった。
これに属していると、スキーマ名はdboに強制的にされてしまうらしい。

SQLスキーマ名(所有者名)の修飾無しでテーブル参照したい
https://oshiete.goo.ne.jp/qa/4681290.html

普段は必ずスキーマを指定するのでこのような問題にぶつかったことはなかったのだが、Visual Studio 2019でTableAdapterを生成した際に自動生成されるInsert文で、Insertした後の値を取るための Select文のテーブル名にスキーマ名が修飾されておらず、今回の問題が発生した。
このスキーマ文が付かないのはバグっぽいなぁ。

今回は、SysAdminを外して解決。
まぁ、そもそも一般ユーザーにSysAdminは要らないからね。
今回、SysAdminを誤って付けちゃったのが原因で、これまでもTableAdapterが生成するSelect文にはスキーマ名が修飾されていなかったのかもしれないなぁ。