SQL Server における所有権とユーザーとスキーマの分離

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

オブジェクトの所有者は、それを管理するための取り消し不可能な権限を持ちます。これは SQL Server のセキュリティの核となる概念です。 オブジェクトの所有者から権限を削除することはできません。また、特定のユーザーがデータベース内のオブジェクトを所有している場合、そのユーザーをデータベースから削除することはできません。

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

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

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

Server.Database.DatabaseSchema.DatabaseObject  

スキーマの所有者と権限

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

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

下位互換性のための組み込みスキーマ

SQL Server には、組み込みのデータベース ユーザーとロール (db_accessadmin、db_backupoperator、db_datareader、db_datawriter、db_ddladmin、db_denydatareader、db_denydatawriter、db_owner、db_securityadmin) と同じ名前を持つ 9 つの定義済みスキーマが付属しています。 これらは下位互換性を確保するために存在します。 ユーザー オブジェクトにはそれらを使用しないことをお勧めします。 固定データベース ロールと同じ名前を持つスキーマを削除することができます。ただし、既に使用されている場合を除きます。そのような場合、drop コマンドでは単にエラーを返し、使用されているスキーマの削除をブロックすることになります。

IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_accessadmin')
DROP SCHEMA [db_accessadmin]
GO

IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_backupoperator')
DROP SCHEMA [db_backupoperator]
GO

IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_datareader')
DROP SCHEMA [db_datareader]
GO

IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_datawriter')
DROP SCHEMA [db_datawriter]
GO

IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_ddladmin')
DROP SCHEMA [db_ddladmin]
GO

IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_denydatareader')
DROP SCHEMA [db_denydatareader]
GO

IF  EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_denydatawriter')
DROP SCHEMA [db_denydatawriter]
GO

IF  EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_owner')
DROP SCHEMA [db_owner]
GO

IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_securityadmin')
DROP SCHEMA [db_securityadmin]
GO

これらのスキーマを model データベースから削除した場合、新しいデータベースに表示されなくなります。 オブジェクトを含むスキーマは削除できません。

次のスキーマは削除できません。

  • dbo
  • guest
  • sys
  • INFORMATION_SCHEMA

注意

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

dbo スキーマ

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

dbo を既定のスキーマとして割り当てられているユーザーは、dbo ユーザー アカウントのアクセス許可を継承しません。 スキーマの権限はユーザーによって継承されるのではなく、そのスキーマに含まれたデータベース オブジェクトによって継承されます。 ユーザーの既定のスキーマは、そのユーザーがオブジェクトを照会するときにスキーマを省略した場合にのみ、オブジェクト参照に使用されます。

注意

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

外部リソース

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

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

関連項目