

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 根據預設或明確結構描述處理 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，而不明確指定結構描述。由於 user1 不存在個別 Windows 登入和使用者，因此只會取得 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 明確指定結構描述。系統將在 [corp\\accounts-group] Windows 群組的預設結構描述中建立資料表 t2。此物件的擁有者將與結構描述 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 進行連線，並嘗試建立物件，而不明確指定結構描述。將在結構描述 sch1 中建立資料表 t2。另請注意，此物件的擁有者將與結構描述 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)
```