原則として、このスキーマでオブジェクトを作成する場合は、明示的にdbo
スキーマを指定する必要があります。
あなたがそうであるようにdb_owner
、デフォルトのスキーマがあるdbo
ので、オブジェクトの作成中にDBOスキーマを指定していない問題はありません。ただし、他の(Windows)ユーザーの場合は同じではありません。
ユーザーはWindows group
、デフォルトのスキーマを持たないメンバーです。この場合、ユーザーがオブジェクトを作成すると、対応するユーザーとスキーマが作成されます。これについては、CREATE SCHEMA(Transact-SQL)に記載されています。
暗黙的なスキーマとユーザーの作成
場合によっては、ユーザーはデータベースユーザーアカウント(データベース内のデータベースプリンシパル)がなくてもデータベースを使用できます。これは、次の状況で発生する可能性があります。
ログインにはCONTROL SERVER特権があります。
Windowsユーザーは個々のデータベースユーザーアカウント(データベース内のデータベースプリンシパル)を持ちませんが、データベースユーザーアカウント(Windowsグループのデータベースプリンシパル)を持つWindowsグループのメンバーとしてデータベースにアクセスします。
データベースユーザーアカウントを持たないユーザーが既存のスキーマを指定せずにオブジェクトを作成すると、データベースプリンシパルとデフォルトスキーマがそのユーザーのデータベースに自動的に作成されます。作成されたデータベースプリンシパルとスキーマは、ユーザーがSQL Serverに接続するときに使用した名前(SQL Server認証ログイン名またはWindowsユーザー名)と同じ名前になります。
この動作は、Windowsグループに基づくユーザーがオブジェクトを作成および所有できるようにするために必要です。ただし、スキーマとユーザーが意図せずに作成される可能性があります。暗黙的にユーザーとスキーマを作成しないように、可能な限りデータベースプリンシパルを明示的に作成し、既定のスキーマを割り当てます。または、2つまたは3つの部分から成るオブジェクト名を使用して、データベースにオブジェクトを作成するときに既存のスキーマを明示的に記述します。
この問題を解決するには、すべてのユーザーまたはWindowsグループに対してdbo
スキーマを割り当てるdefault schema
か、オブジェクトを作成するときにスキーマを明示的に記述します。常に。