デフォルトまたは明示的なスキーマに基づく DDL ステートメントの動作の処理
AD 認証セッションを使用する場合、現在のセッションのデフォルトスキーマは次の条件によって決まります。
個々のデータベースユーザーが存在する場合、ユーザーのデフォルトスキーマは現在のセッションのデフォルトスキーマと見なされます。
グループデータベースユーザーのデフォルトスキーマが存在する場合、グループデータベースユーザーのデフォルトスキーマは、最小のプリンシパル ID を持つ現在のセッションのデフォルトスキーマと見なされます。
CREATE DDL ステートメントの動作について
CREATE DDL ステートメントに明示的なスキーマが指定されていない場合、オブジェクトの作成は現在のセッションのデフォルトスキーマで行われます。スキーマがデフォルトか明示的かを判断できない場合、DDL ステートメントは次のエラーをスローします。
"Babelfish Unsupported Command : Schema required for CREATE DDLs when connecting with Active Directory Group authentication. Assign default schema to group user or specify schema in command."
例 : Windows グループユーザー用のデフォルトスキーマが存在しない
Windows グループユーザー [corp\accounts-group] には NULL のデフォルトスキーマがあり、AD ユーザー user1 はスキーマを明示的に指定せずに DDL を実行しようとしています。個々の Windows ログインとユーザーは user1 には存在しないため、Windows グループユーザー [corp\accounts-group] のデータベースレベルの権限のみを取得します。
1>
create TABLE t2(a int);2>
GOMsg 33557097, Level 16, State 1, Server db-inst, Line 1 Babelfish Unsupported Command : Schema required for CREATE DDLs when connecting with Active Directory Group authentication. Assign default schema to group user or specify schema in command.
注記
AD ユーザー user1 の個々の Windows ログインとユーザーは存在しません
例 : Windows グループユーザーにデフォルトのスキーマが存在する
sysadmin を使用して、デフォルトスキーマで [corp\accounts-group] ログインのための Windows グループユーザーを作成します。
1>
CREATE USER [corp\accounts-group] FOR LOGIN [corp\accounts-group] WITH DEFAULT_SCHEMA = sch_acc;2>
GO1>
CREATE SCHEMA sch_acc AUTHORIZATION [gad\accounts-group];2>
GO1>
SELECT name, principal_id, default_schema_name FROM sys.database_principals WHERE name = 'corp\accounts-group';2>
GOname principal_id default_schema_name ------------------ ------------ ------------------- corp\accounts-group 24162 sch_acc (1 rows affected)
AD ユーザー user1 を使用してスキーマを明示的に指定せずにオブジェクトを作成してみてください。テーブル t2 は、[corp\accounts-group] Windows グループユーザーのデフォルトスキーマで作成されます。このオブジェクトの所有者はスキーマ sch_acc の所有者と同じになります。
1>
CREATE TABLE t_group(a int);2>
GO1>
SELECT name, schema_name(schema_id) FROM sys.objects WHERE name like 't_group';2>
GOname schema_name ------- ----------- t_group sch_acc (1 rows affected)
注記
AD ユーザー user1 の個々の Windows ログインとユーザーは存在しません
例 : 個々のデータベースユーザーが AD ユーザーにも存在する
個々のデータベースユーザーが AD ユーザーにも存在する場合、オブジェクトは常に個々のデータベースユーザーに関連付けられたスキーマに作成されます。データベースユーザーにスキーマが存在しない場合、dbo スキーマが使用されます。AD ユーザー user1 の個々の Windows ログインおよびデータベースユーザーを作成します。sysadmin ログインを使用して TDS エンドポイント経由で接続する
1>
CREATE LOGIN [corp\user1] FROM WINDOWS;2>
GO1>
CREATE USER [corp\user1] FOR LOGIN [corp\user1] WITH DEFAULT_SCHEMA = sch1;2>
GO1>
CREATE SCHEMA sch1 AUTHORIZATION [corp\user1];2>
GO1>
SELECT name, default_schema_name FROM sys.database_principals WHERE name = 'corp\user1';2>
GOname default_schema_name --------- ------------------- corp\user1 sch1 (1 rows affected)
AD ユーザー user1 を使用して接続し、スキーマを明示的に指定せずにオブジェクトを作成してみてください。テーブル t2 はスキーマ sch1 で作成されます。また、このオブジェクトの所有者はスキーマ sch1 の所有者と同じであることに注意してください。
1>
CREATE TABLE t2(a int);2>
GO1>
SELECT name, schema_name(schema_id) FROM sys.objects WHERE name like 't2';2>
GOname schema_name ---- ----------- t2 sch1 (1 rows affected)