既定のスキーマを設定しているのにテーブルにアクセスできない[SQL Server]

SQL Server 2005からスキーマという概念が導入されました。
例えばテーブルを示す完全修飾名は、サーバ名.データベース名.スキーマ名.テーブル名となり、テーブル名の前にスキーマ名が入ります。
スキーマを作成・指定しなければ既定のスキーマはdboとなります。

スキーマを変更したテーブルにODBC経由でアクセスするためには、スキーマ名.テーブル名でアクセスしなければなりませんが、データベースのユーザに既定のスキーマを指定すれば、テーブル名だけでアクセスが可能になります。(サーバ名.データベース名はODBCのデータソースで解決している)

ですが、既定のスキーマを指定したにもかかわらず、既定のスキーマに属するテーブルにアクセスできないことがあります。
MSDNによると、

ユーザーが固定サーバー ロール sysadmin のメンバである場合、DEFAULT_SCHEMA の値は無視されます。固定サーバー ロール sysadmin のすべてのメンバには、dbo の既定のスキーマが割り当てられます。

つまり、ログインにsysadminのサーバーロールをつけると、既定のスキーマではなくdboが使われるということで、既定のスキーマは無視されるということです。
CREATE TABLEなどはできなくなりますが、sysadminは外しておくのがよいようです。

3件のコメント »

  1. sa said

    まさにこの現象に、1週間近く悩まされていました。
    sysadminだと、スキーマが使えないとは・・・

    本当に助かりました。どうもありがとうございました。
    感謝してもしきれません。

  2. 通りすがり said

    とても良い情報です。
    SQLServer2019 でも同じ動きのままです。

    sys からテーブル一覧とか取得したいのに使えないのか・・・

  3. n said

    助かりました

RSS feed for comments on this post · TrackBack URI

コメントを残す