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

SQL Server 2005 では、スキーマの動作が変更されました。スキーマはデータベース ユーザーと同等でなくなり、各スキーマはそれを作成したデータベース ユーザーとは独立して存在する別個の名前空間となりました。つまり、スキーマは単にオブジェクトのコンテナーです。スキーマはどのユーザーでも所有でき、その所有権は譲渡可能です。

新しい動作

スキーマから所有権を切り離すことには重要な意味があります。

  • スキーマとスキーマ スコープのセキュリティ保護可能なリソースの所有権を譲渡できます。詳細については、「ALTER AUTHORIZATION (Transact-SQL)」を参照してください。

  • スキーマ間でオブジェクトを移動できます。詳細については、「ALTER SCHEMA (Transact-SQL)」を参照してください。

  • 1 つのスキーマに複数のデータベース ユーザーが所有するオブジェクトを含めることができます。

  • 複数のデータベース ユーザーが 1 つの既定のスキーマを共有できます。

  • スキーマとスキーマ内のセキュリティ保護可能なリソースの権限を、以前のリリースより厳密に管理できます。詳細については、「GRANT (スキーマ権限の許可) (Transact-SQL)」および「GRANT (オブジェクトの権限の許可) (Transact-SQL)」を参照してください。

  • どのデータベース プリンシパルでも、1 つのスキーマを所有できます。このデータベース プリンシパルにはロールおよびアプリケーション ロールが含まれます。

  • 対応するスキーマ内のオブジェクトを削除しなくても、データベース ユーザーを削除できます。

  • 以前のリリースの SQL Server 用に記述されたコードでスキーマとデータベース ユーザーを同等と見なしている場合は、そのコードが不適切な結果を返す場合があります。

  • 以前のリリースの SQL Server 用にデザインされたカタログ ビューは、不適切な結果を返す場合があります。これには、sysobjects も含まれます。

  • データベース オブジェクトを作成する場合に、有効なドメイン プリンシパル (ユーザーまたはグループ) をオブジェクト所有者として指定すると、ドメイン プリンシパルがスキーマとしてデータベースに追加されます。新しいスキーマは、そのドメイン プリンシパルが所有します。

新しいカタログ ビュー

SQL Server 2005 以降では、スキーマがメタデータに反映される明示的なエンティティとなっています。このため、各スキーマの所有者は 1 人に限定されますが、1 人のユーザーが多数のスキーマを所有できます。この複雑なリレーションシップは SQL Server 2000 のシステム テーブルには反映されないため、SQL Server 2005 で新しいメタデータを正確に反映するカタログ ビューが新たに導入されました。

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

SQL Server 2000 システム テーブル

SQL Server 2005 以降のカタログ ビュー

sysusers

sys.database_principals

sys.schemas

syslogins

sys.server_principals

SQL Server 2005 では、250 を超える新しいカタログ ビューが導入されました。新しいカタログ ビューを使用してメタデータにアクセスすることを強くお勧めします。詳細については、「カタログ ビュー (Transact-SQL)」を参照してください。

新しい 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

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
注記注意

次のいずれかの DDL ステートメントが使用されたデータベースでは、新しいカタログ ビューを使用する必要があります。CREATE/ALTER/DROP SCHEMA、CREATE/ALTER/DROP USER、CREATE/ALTER/DROP ROLE、CREATE/ALTER/DROP APPROLE、ALTER AUTHORIZATION。

既定のスキーマ

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

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