私の同僚はどのようにして自分のスキーマを手に入れましたか?


14

次のストアドプロシージャがあります。

  • テーブルが存在するかどうかを確認し、存在する場合は削除します。
  • そのテーブルを再度作成します
  • 次に、そのテーブルに約30個のクエリを入力します。

私(DBオーナー)がこのプロシージャを実行すると、すべてが意図したとおりに機能します。Active Directoryのロールを介してこのデータベースに対するDROP / CREATE権限を持っている同僚がそうすると、いくつかの問題が発生します。私の心を揺さぶるものはこれです:

テーブルの作成ではdbo、名前の前に明示的に指定されたスキーマがありませんでした。これにより、tableというdomain\cowork_id.table_name_hereテーブルが作成されました。彼の個人スキーマで作成されたテーブルに加えて、彼はデータベースにそのスキーマも持っています(プロシージャを実行する前は存在していませんでした)。

どうした?SQL Server dboが指定されていない場合ではなく、ユーザーのスキーマでテーブルを作成するのはなぜですか?


回答:


26

原則として、このスキーマでオブジェクトを作成する場合は、明示的に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か、オブジェクトを作成するときにスキーマを明示的に記述します。常に。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.