

# デフォルトまたは明示的なスキーマに基づく DDL ステートメントの動作の処理
<a name="babelfish-kerberos-securityad-ddl"></a>

 AD 認証セッションを使用する場合、現在のセッションのデフォルトスキーマは次の条件によって決まります。
+ 個々のデータベースユーザーが存在する場合、ユーザーのデフォルトスキーマは現在のセッションのデフォルトスキーマと見なされます。
+ グループデータベースユーザーのデフォルトスキーマが存在する場合、グループデータベースユーザーのデフォルトスキーマは、最小のプリンシパル ID を持つ現在のセッションのデフォルトスキーマと見なされます。

## CREATE DDL ステートメントの動作について
<a name="babelfish-kerberos-securityad-ddlcreate"></a>

 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."
```

**Example : Windows グループユーザー用のデフォルトスキーマが存在しない**  
Windows グループユーザー [corp\\accounts-group] には NULL のデフォルトスキーマがあり、AD ユーザー user1 はスキーマを明示的に指定せずに DDL を実行しようとしています。個々の Windows ログインとユーザーは user1 には存在しないため、Windows グループユーザー [corp\\accounts-group] のデータベースレベルの権限のみを取得します。  

```
1> create TABLE t2(a int);
2> GO

Msg 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 ログインとユーザーは存在しません

**Example : Windows グループユーザーにデフォルトのスキーマが存在する**  
sysadmin を使用して、デフォルトスキーマで [corp\\accounts-group] ログインのための Windows グループユーザーを作成します。  

```
1> CREATE USER [corp\accounts-group] FOR LOGIN [corp\accounts-group] WITH DEFAULT_SCHEMA = sch_acc;
2> GO
1> CREATE SCHEMA sch_acc AUTHORIZATION [gad\accounts-group];
2> GO
1> SELECT name, principal_id, default_schema_name FROM sys.database_principals WHERE name = 'corp\accounts-group';
2> GO
                
name               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> GO
1> SELECT name, schema_name(schema_id) FROM sys.objects WHERE name like 't_group';
2> GO

name    schema_name
------- -----------
t_group sch_acc

(1 rows affected)
```
AD ユーザー user1 の個々の Windows ログインとユーザーは存在しません

**Example : 個々のデータベースユーザーが AD ユーザーにも存在する**  
 個々のデータベースユーザーが AD ユーザーにも存在する場合、オブジェクトは常に個々のデータベースユーザーに関連付けられたスキーマに作成されます。データベースユーザーにスキーマが存在しない場合、dbo スキーマが使用されます。AD ユーザー user1 の個々の Windows ログインおよびデータベースユーザーを作成します。sysadmin ログインを使用して TDS エンドポイント経由で接続する   

```
1> CREATE LOGIN [corp\user1] FROM WINDOWS;
2> GO
1> CREATE USER [corp\user1] FOR LOGIN [corp\user1] WITH DEFAULT_SCHEMA = sch1;
2> GO
1> CREATE SCHEMA sch1 AUTHORIZATION [corp\user1];
2> GO
1> SELECT name, default_schema_name FROM sys.database_principals WHERE name = 'corp\user1';
2> GO

name      default_schema_name
--------- -------------------
corp\user1 sch1

(1 rows affected)
```
 AD ユーザー user1 を使用して接続し、スキーマを明示的に指定せずにオブジェクトを作成してみてください。テーブル t2 はスキーマ sch1 で作成されます。また、このオブジェクトの所有者はスキーマ sch1 の所有者と同じであることに注意してください。  

```
1> CREATE TABLE t2(a int);
2> GO
1> SELECT name, schema_name(schema_id) FROM sys.objects WHERE name like 't2';
2> GO
            
name schema_name
---- -----------
t2   sch1

(1 rows affected)
```