

# Tratar o comportamento da declaração DDL com base no esquema padrão ou explícito
<a name="babelfish-kerberos-securityad-ddl"></a>

 Ao usar uma sessão autenticada pelo AD, o esquema padrão da sessão atual é determinado pelas seguintes condições: 
+ Se existir um usuário individual do banco de dados, o esquema padrão do usuário será considerado o esquema padrão da sessão atual.
+ Se o esquema padrão para um usuário do banco de dados de grupo existir, esse esquema será considerado o esquema padrão da sessão atual com o menor ID da entidade principal.

## Noções básicas sobre o comportamento da declaração CREATE DDL
<a name="babelfish-kerberos-securityad-ddlcreate"></a>

 Se não houver um esquema explícito especificado na declaração CREATE DDL, a criação do objeto ocorrerá no esquema padrão da sessão atual. Se não for possível determinar se o esquema é padrão ou explícito, a declaração DDL gerará o seguinte erro: 

```
"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 : o esquema padrão não existe para o usuário do grupo do Windows.**  
O usuário do grupo do Windows [corp\\accounts-group] tem um esquema padrão NULL e o user1 do AD está tentando executar o DDL sem especificar o esquema explicitamente. Como o login e usuário individuais do Windows não existem para user1, ele receberá os privilégios de nível de banco de dados somente do usuário do grupo do 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.
```
O login e usuário individuais do Windows não existem para o user1 do AD.

**Example : existe um esquema padrão para usuários do grupo do Windows.**  
Crie um usuário de grupo do Windows para login [corp\\accounts-group] com esquema padrão usando sysadmin.   

```
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)
```
 Tente criar um objeto sem especificar explicitamente o esquema usando o user1 do AD. A tabela t2 será criada no esquema padrão do usuário do grupo do Windows [corp\\accounts-group]. O proprietário desse objeto será o mesmo proprietário do esquema 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)
```
O login e usuário individuais do Windows não existem para o user1 do AD.

**Example : o usuário individual do banco de dados também existe para um usuário do AD.**  
 Se também existir um usuário de banco de dados individual para um usuário do AD, os objetos sempre serão criados no esquema associado ao usuário individual do banco de dados. Se o esquema não existir para o usuário do banco de dados, o esquema dbo será usado. Crie um login e um usuário de banco de dados individuais do Windows para o user1 do AD. Conectar-se por meio do endpoint TDS usando um login de administrador do sistema   

```
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)
```
 Conecte-se utilizando o user1 do AD e tente criar um objeto sem especificar explicitamente o esquema. A tabela t2 será criada no esquema sch1. Observe também que o proprietário desse objeto será o mesmo do esquema 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)
```