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

更新 : 2006 年 12 月 12 日

SQL Server 2005 からは、各オブジェクトがデータベース スキーマに属するようになりました。データベース スキーマは、データベース ユーザーとは別の、独立した名前空間です。スキーマはオブジェクトのコンテナと考えることができます。スキーマはデータベース内で作成したり変更することができ、ユーザーにはスキーマに対するアクセス権を与えることができます。どのユーザーもスキーマを所有でき、スキーマの所有権は譲渡できます。

ms190387.note(ja-jp,SQL.90).gifメモ :
データベース スキーマは、XML スキーマとは異なるものです。XML スキーマの詳細については、「サーバー上の XML スキーマ コレクションの管理」を参照してください。

データベース オブジェクト スキーマの作成の詳細については、「CREATE SCHEMA (Transact-SQL)」を参照してください。

新しい動作

SQL Server の以前のバージョンでは、データベース ユーザーとデータベース スキーマは概念的に同じオブジェクトでした。SQL Server 2005 からは、ユーザーとスキーマは切り離され、スキーマはオブジェクトのコンテナとして機能するようになりました。

スキーマから所有権を切り離すと、重要な変化があります。次に示すように、データベース スキーマを使用すると、データベース オブジェクトのセキュリティをより柔軟に制御できます。

  • スキーマとスキーマ内のセキュリティ保護可能なリソースの権限を、以前のリリースより厳密に管理できます。詳細については、「GRANT (スキーマ権限の許可) (Transact-SQL)」および「GRANT (オブジェクトの権限の許可) (Transact-SQL)」を参照してください。
  • スキーマとスキーマ スコープのセキュリティ保護可能なリソースの所有権を譲渡できます。詳細については、「ALTER AUTHORIZATION (Transact-SQL)」を参照してください。
  • スキーマ間でオブジェクトを移動できます。詳細については、「ALTER SCHEMA (Transact-SQL)」を参照してください。
  • 1 つのスキーマに複数のデータベース ユーザーが所有するオブジェクトを含めることができます。
  • 複数のデータベース ユーザーが 1 つの既定のスキーマを共有できます。
  • どのデータベース プリンシパルでも、1 つのスキーマを所有できます。このデータベース プリンシパルにはロールおよびアプリケーション ロールが含まれます。
  • 対応するスキーマ内のオブジェクトを削除しなくても、データベース ユーザーを削除できます。

データベース スキーマを使用すると、以前のバージョンと比べて次のようなセキュリティ関連の変更もあります。

  • 以前のリリースの SQL Server 用に記述されたコードでスキーマとデータベース ユーザーとを同等であると見なしている場合、このコードは不適切な結果を返す場合があります。
  • 以前のリリースの SQL Server 用にデザインされたカタログ ビューは、不適切な結果を返す場合があります。このようなカタログ ビューには sysobjects があります。
  • ユーザーが複数のスキーマを所有できるため、所有権の継承とユーザー コンテキストの切り替えの動作は変更されます。所有権の継承の詳細については、「所有権の継承」および「権限の階層」を参照してください。コンテキストの切り替えの詳細については、「コンテキストの切り替え」を参照してください。
  • SQL Server 2000 では、データベース オブジェクトはユーザーが所有するものでした。SQL Server 2000 では、データベース オブジェクトへの参照で指定する 4 つの要素は [DatabaseServer].[DatabaseName].[ObjectOwner].[DatabaseObject] でした。SQL Server 2005 からは、データベース オブジェクトへの参照で指定する 4 つの要素は [DatabaseServer].[DatabaseName].[DatabaseSchema].[DatabaseObject] になります。

オブジェクトの所有権の変更

次のオブジェクトの所有者プロパティは、ユーザーではなくスキーマを指すようになります。

  • CREATE TABLE
  • ALTER TABLE
  • CREATE VIEW
  • ALTER VIEW
  • CREATE INDEX
  • ALTER INDEX
  • CREATE FUNCTION
  • ALTER FUNCTION
  • DROP FUNCTION
  • VIEW_TABLE_USAGE
  • VIEW_COLUMN_USAGE
  • TABLE_CONSTRAINTS
  • REFERENTIAL_CONSTRAINTS
  • KEY_COLUMN_USAGE
  • CONSTRAINT_TABLE_USAGE
  • CONSTRAINT_COLUMN_USAGE
  • CHECK_CONSTRAINTS
  • COLUMN_DOMAIN_USAGE
  • COLUMNS
  • DOMAIN_CONSTRAINTS
  • ROUTINE_COLUMNS

列でユーザー メタデータとスキーマ メタデータのどちらが返されるかの詳細については、後の「スキーマ カタログ ビューと関数」を参照してください。

カタログ ビューと関数に置き換えられたシステム テーブル

SQL Server 2005 では 250 を超える新しいカタログ ビューが導入されました。そのいくつかは、データベース ユーザーとスキーマ オブジェクトを扱うもので、SQL Server 2000 システム テーブルの代わりに使用されます。新しいカタログ ビューを使用してメタデータにアクセスすることを強くお勧めします。詳細については、「カタログ ビュー (Transact-SQL)」を参照してください。

次の表に、SQL Server 2000 のシステム テーブルと、対応する SQL Server 2005 のカタログ ビューとのマッピングを示します。

SQL Server 2000 システム テーブル SQL Server 2005 カタログ ビュー

sysusers

sys.database_principals (Transact-SQL)

sys.schemas (Transact-SQL)

syslogins

sys.server_principals (Transact-SQL)

既定のスキーマ

セキュリティ保護可能なリソースの名前が完全修飾されていない場合、SQL Server 2000 ではこれを解決するため名前解決が使用され、呼び出し側のデータベース ユーザーが所有するスキーマと dbo が所有するスキーマが照合されます。

SQL Server 2005 では、各ユーザーに既定のスキーマを割り当てることができます。既定のスキーマは、CREATE USER や ALTER USER の DEFAULT_SCHEMA オプションを使用して、設定および変更できます。DEFAULT_SCHEMA が定義されていない場合、SQL Server 2005 では dbo スキーマが既定のスキーマと見なされます。

ms190387.note(ja-jp,SQL.90).gifメモ :
Windows 認証されたグループ経由で接続するユーザーには、既定のスキーマが関連付けられません。このようにスキーマを持たないユーザーがオブジェクトを作成すると、新しいスキーマが作成されます。名前は現在のユーザー名に設定され、このユーザー名が付けられた新しい名前空間内にテーブル オブジェクトが作成されます。

新しいデータ定義言語 (DDL) ステートメントによって、システム メタデータが複雑になり、sysobjects などの古いシステム テーブルにはこのデータが正確に反映されない可能性があります。次の例では、sysobjects によって返されるユーザー ID とスキーマ名は同期されていません。これは、SQL Server 2005 で導入されたユーザーとスキーマの区別を示すものです。

USE tempdb
GO
CREATE LOGIN u1 WITH PASSWORD = 'Mdfjd$sakj943857l7sdfh##30'
CREATE USER u1 WITH DEFAULT_SCHEMA = u1
GO
GRANT CREATE TABLE TO u1 
GO
CREATE SCHEMA sch1
GO
CREATE SCHEMA u1 AUTHORIZATION u1
GO
EXECUTE AS USER = 'u1'
GO
CREATE TABLE t1(c1 int)
GO
REVERT
GO
SELECT user_name(uid) , * FROM sysobjects WHERE name = 't1'
GO
ms190387.Caution(ja-jp,SQL.90).gif注意 :
次のいずれかの DDL ステートメントが使用されたデータベースでは、新しいカタログ ビューを使用する必要があります。CREATE/ALTER/DROP SCHEMA、CREATE/ALTER/DROP USER、CREATE/ALTER/DROP ROLE、CREATE/ALTER/DROP APPROLE、ALTER AUTHORIZATION。

スキーマ カタログ ビューと関数

SQL Server 2005 からは、スキーマはメタデータに反映される明確なエンティティになりました。この結果として、スキーマの所有者には 1 ユーザーだけが許可される一方、1 ユーザーが 1 つ以上のスキーマを所有できます。この複雑なリレーションシップは、SQL Server 2000 のシステム テーブルには反映されないため、SQL Server 2005 では、新しいメタデータを正確に反映する新しいカタログ ビューが導入されています。

次の表に、SQL Server 2005 のスキーマのカタログ ビュー、メタデータ、関数を示します。

項目 参照先

一般的なスキーマ メタデータ

sys.schemas (Transact-SQL)

情報スキーマ ビュー

情報スキーマ ビュー (Transact-SQL)

INFORMATION_SCHEMA.SCHEMATA ビューにより返される列の定義

SCHEMATA (Transact-SQL)

A. スキーマを作成しユーザーに所有権を付与する

次の例では、Marjorie という SQL Server ログインおよびユーザーと、Auditing という新しいスキーマを AdventureWorks データベースに追加し、MarjorieAuditing スキーマの所有者として割り当てます。

CREATE LOGIN Marjorie
    WITH PASSWORD = '8fdKJl3$nlNv3049jsKK';
USE AdventureWorks;
CREATE USER Marjorie FOR LOGIN Marjorie
GO
CREATE SCHEMA Auditing AUTHORIZATION Marjorie;
GO

B. ユーザーに別のスキーマに対する権限を付与する

次の例では、Marjorie というユーザーに、AdventureWorks データベースの Purchasing スキーマに対する SELECT 権限を与えます。

USE AdventureWorks;
GO
GRANT SELECT ON SCHEMA::Purchasing TO Marjorie;
GO

C. スキーマの所有権を変更する

次の例では、新しいユーザー JonAdventureWorks データベースに作成し、JonAdventureWorks データベースの Auditing スキーマの所有権を与えます。その後、Marjorie というユーザーを AdventureWorks データベースから削除します。

USE AdventureWorks;
GO
/* Create a new user in the database */
CREATE LOGIN Jon
    WITH PASSWORD = '1fdKJl3$nlNv3049jsBB';
USE AdventureWorks;
CREATE USER Jon FOR LOGIN Jon
GO
ALTER AUTHORIZATION ON SCHEMA::Auditing TO Jon;
GO
/* Removes the user from the system */
DROP LOGIN Marjorie;
GO
DROP USER Marjorie;
GO

D. スキーマの所有権を表示する

次の例では、AdventureWorks データベースの Auditing スキーマの所有者を表示します。

USE AdventureWorks;
GO
/* This method uses the INFORMATION_SCHEMA views */
SELECT * 
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'Auditing';
GO

/* This method uses the sys.schemas catalog and links
   the names of the database users and server logins */
SELECT s.name AS 'Schema Name'
, db.name AS 'Database User Name'
, svr.name AS 'SQL Server Login Name'
FROM sys.schemas s
/* Obtains the name of the database user */
   INNER JOIN sys.database_principals db
      ON s.principal_id = db.principal_id
/* Obtains the name of the server login */
      INNER JOIN sys.server_principals svr
         ON db.sid = svr.sid
WHERE s.name = 'Auditing'
ORDER BY s.name

参照

概念

権限の階層
プリンシパル

その他の技術情報

CREATE SCHEMA (Transact-SQL)
ALTER SCHEMA (Transact-SQL)
ALTER AUTHORIZATION (Transact-SQL)
DROP SCHEMA (Transact-SQL)
sys.schemas (Transact-SQL)
CREATE USER (Transact-SQL)
ALTER USER (Transact-SQL)
パブリケーション データベースでのスキーマの変更

ヘルプおよび情報

SQL Server 2005 の参考資料の入手

変更履歴

リリース 履歴

2006 年 12 月 12 日

変更内容 :
  • 新しい例、スキーマの使用に関する追加情報、新しいリンクを追加しました。

2006 年 7 月 17 日

変更内容 :
  • トピックの内容を大幅に再編成しました。