SQL Server における所有権とユーザーとスキーマの分離 (ADO.NET)

更新 : November 2007

オブジェクトの所有者は、それを管理するための取り消し不可能な権限を持ちます。これは SQL Server のセキュリティの核となる概念です。オブジェクトの所有者から権限を削除することはできません。また、特定のユーザーがデータベース内のオブジェクトを所有しているときに、そのユーザーをデータベースから削除することもできません。SQL 2000 では、所有者を指定せずにオブジェクトを作成した場合、それを作成したユーザーがオブジェクトの所有者になります。オブジェクトの所有者には、そのオブジェクトを管理するための取り消し不可能な権限が与えられるため、複数のユーザーがオブジェクトを所有した場合には、それが原因で問題が生じることがありました。すべてのデータベース オブジェクトに対して所有者を 1 人だけ割り当て、所有権の継承を利用することで SQL Server 2000 の権限の管理を簡素化できます。詳細については、「SQL Server の承認とアクセス許可 (ADO.NET)」を参照してください。

Bb669061.alert_note(ja-jp,VS.90).gifメモ :

sysadmin 固定サーバー ロールおよび db_owner 固定データベース ロールのメンバにも、データベース内のすべてのオブジェクトに対する取り消し不可能な所有権が与えられます。

SQL Server 2005 より前のバージョンでは、次の 4 つの部分から成る命名構文を使用して、オブジェクトを参照します。

Server.Database.ObjectOwner.DatabaseObject

データベース ユーザー Bob と Sue がそれぞれ Table1 を作成した場合、完全修飾名を使用する必要があります。システム管理者またはデータベース所有者がオブジェクトを作成した場合、そのオブジェクトは個々のユーザーではなく、dbo ユーザー アカウントによって所有されます。

SELECT col1 FROM Bob.Table1
SELECT col1 FROM Sue.Table1
SELECT col1 FROM dbo.Table1
Bb669061.alert_note(ja-jp,VS.90).gifメモ :

dbo によって所有されたオブジェクトを参照する場合は、必ずしも ObjectOwner.DatabaseObject 構文を使用する必要はありません。ただし、ObjectOwner.DatabaseObject 構文を使用した方が効率的です。所有者名が指定されなかった場合、SQL Server 2000 は、まず、そのオブジェクトが現在のユーザー名の下で存在しているかどうかをチェックした後、さらに、dbo によって所有されているかどうかをチェックします。2 つの部分から成る名前を指定することで、余分な手順を省略することができます。

ユーザーとスキーマの分離

SQL Server 2005 では、ユーザーとスキーマの分離により、データベース オブジェクトの権限をより柔軟に管理できるようになりました。スキーマは、データベース オブジェクトの名前付きのコンテナです。これにより、複数のオブジェクトを個別の名前空間にグループ化できます。たとえば、AdventureWorks サンプル データベースには、Production、Sales、および HumanResources というスキーマが格納されています。

オブジェクトを参照する 4 つの部分から成る命名構文では、スキーマ名が指定されます。

Server.Database.DatabaseSchema.DatabaseObject

スキーマの所有者と権限

スキーマは任意のデータベース プリンシパルが所有できるほか、1 つのプリンシパルが複数のスキーマを所有することもできます。スキーマにはセキュリティ ルールを適用できます。適用されたセキュリティ ルールは、そのスキーマのすべてのオブジェクトによって継承されます。スキーマに対してアクセス権限を設定すると、そのスキーマに追加された新しいオブジェクトにこれらの権限が自動的に適用されます。ユーザーに既定のスキーマを割り当て、複数のデータベース ユーザーでその同じスキーマを共有できます。

既定では、開発者がスキーマにオブジェクトを作成した場合、そのオブジェクトは、開発者ではなく、そのスキーマを所有するセキュリティ プリンシパルによって所有されることになります。オブジェクトの所有権は、Transact-SQL ステートメント ALTER AUTHORIZATION で転送できます。1 つのスキーマに対し、それぞれ異なるユーザーによって所有されたオブジェクトを追加することもできます。そうすることで、スキーマそのものに割り当てるよりも権限を細かく管理できますが、権限の管理が煩雑になるため、この方法はお勧めできません。オブジェクトはスキーマ間で移動できるほか、プリンシパル間でスキーマの所有権を転送することもできます。データベース ユーザーを削除してもスキーマには影響しません。

組み込みスキーマ

SQL Server には、組み込みのデータベース ユーザーおよびロールと同じ名前を持った 10 個の定義済みスキーマが付属しています。これらは主に下位互換性を確保するために存在します。固定データベース ロールと同じ名前のスキーマは、不要であれば削除してもかまいません。次のスキーマを削除することはできません。

  • dbo

  • guest

  • sys

  • INFORMATION_SCHEMA

これらを model データベースから削除した場合、新しいデータベースにはこれらのスキーマが存在しなくなります。

Bb669061.alert_note(ja-jp,VS.90).gifメモ :

sys スキーマおよび INFORMATION_SCHEMA スキーマは、システム オブジェクト用に予約されています。これらのスキーマにオブジェクトを作成することはできません。また、これらのスキーマを削除することもできません。

dbo スキーマ

dbo スキーマは、新しく作成されたデータベースに使用される既定のスキーマです。dbo スキーマは、dbo ユーザー アカウントによって所有されます。既定では、Transact-SQL コマンド CREATE USER で作成されたユーザーには、dbo が既定のスキーマとして割り当てられます。

dbo スキーマが割り当てられたユーザーは、dbo ユーザー アカウントの権限を継承しません。スキーマの権限はユーザーによって継承されるのではなく、そのスキーマに含まれたデータベース オブジェクトによって継承されます。

Bb669061.alert_note(ja-jp,VS.90).gifメモ :

SQL Server 2005 では、一部分から成る命名構文を使ってデータベース オブジェクトを参照した場合、まずユーザーの既定のスキーマが検索されます。そこで目的のオブジェクトが見つからなかった場合は、dbo スキーマ内が検索されます。dbo スキーマ内にオブジェクトが見つからなかった場合は、エラーが返されます。

外部リソース

オブジェクトの所有権とスキーマの詳細については、次のリソースを参照してください。

リソース

説明

ユーザーとスキーマの分離 (SQL Server 2008 オンライン ブック)

ユーザーとスキーマの分離によって導入された変更について説明します。新しい動作とそれが所有権、カタログ ビュー、および権限に与える影響を取り上げています。

ユーザーとスキーマの分離 (SQL Server 2005 オンライン ブック)

ユーザーとスキーマの分離によって導入された変更について説明します。新しい動作とそれが所有権、カタログ ビュー、および権限に与える影響を取り上げています。

所有権の継承の使用 (SQL Server 2000 オンライン ブック)

ユーザーがオブジェクトの所有者から継承できる権限について説明します。

参照

概念

SQL Server におけるアプリケーション セキュリティのシナリオ (ADO.NET)

SQL Server での認証 (ADO.NET)

SQL Server のサーバー ロールとデータベース ロール (ADO.NET)

SQL Server の承認とアクセス許可 (ADO.NET)

その他の技術情報

ADO.NET アプリケーションのセキュリティ保護