Entendendo o Contained Database SQL Server 2012

Posted on julho 2, 2012

3


Introdução

Um dos grandes problemas que possuímos em versões anteriores do SQL Server é a transferência de Logins. A estrutura de segurança do SQL Server possui dois níveis, o login e o user (usuário).

Bem, o login é a primeira parte do layout, primeiro você possui acesso a instância do banco de dados, após isso, um login é mapeado para o banco de dados.

(Figura 1 – Nível de Segurança por camadas.)

Ou seja, quando era realizao uma migração de uma base de dados para outra instância, os usuários do banco de dados, ficavam sem seu login, esses usuários são chamados de usuários orfãos.

Sendo assim, todas as vezes que necessitávamos migrar um banco de dados, era necessário levar todos os logins e usuário para o outro servidor ou instância de banco de dados, isso porque o que faz com que um usuário e login estejam ligados é o Security Identifier (SID), um código que identifica unicamente um usuário com seu respectivo login.

Para resolver esses problemas anteriores podemos utilizar o sp_help_revlogin – https://luanmorenodba.wordpress.com/2012/06/27/sp_help_revlogin-no-ssis-2012/ ou utilizar o SSIS para realizar a transferência dos logins para a outra instância – http://www.sqlservercentral.com/articles/SQL+Server+2012/89555/ ou ainda mais, se você se esqueceu de migrar os logins para a base de dados  você pode ainda utilizar a procedure sp_change_users_login – https://luanmorenodba.wordpress.com/2012/06/27/usurios-orfos-utilize-sp_change_users_login/

 

Porém agora no SQL Server 2012 possúimos a solução para esse problema.

 

O que é um Contained Database

Bem, primeiramente iremos entender a palavra “CONTAINED” dentro desse escopo.

 

Contained

Um usuário que reside dentro de um limite de aplicação, ou seja esse usuário não pode realizar acesso externo.

Uncontained

Um usuário que atravessa/ultrapassa a fronteira da aplicação, ou seja ele pode acessar recursos externo.

Partial Contained Database

Esse modelo faz com que o usuário acesse os recursos internos e externos e é nesse que o SQL Server 2012 se encaixa.

Full Contained Database

Nesse modelo não é permitido que o usuário acesse os recursos externos.

 

Desse modo, tendo agora um modelo parcial de banco de dados, as credenciais são armazenadas dentro do banco de dados, alêm de não ser mais necessário um usuário possuir um SID. Com isso tambêm resolvemos o problema do Collation, se o Collation do servidor for diferente da base de dados, então o banco de dados TEMPDB irá utilizar o Collation do servidor.

 

Criação Banco de Dados

Primeiramente devemos habilitar o SQL Server para isso…

 

sp_configure ‘contained database authentication’, 1

RECONFIGURE

go

 

Configuration option ‘contained database authentication’ changed from 0 to 1. Run the RECONFIGURE statement to install.

 

Criando um banco de dados de teste…

 

CREATE DATABASE ContainedDatabase

     CONTAINMENT = PARTIAL

GO

 

Untitled

(Figura 2 – Acessando o Contained Database.)

 

Untitled

(Figura 3 – Informações sobre o Contained Database.)

 

Após efetuado a criação de um banco de dados possuindo essa opção, iremos realizar a criação de um usuário para o mesmo, sendo que ele não possuirá nenhum mapeamento em relação ao login.

Realizando Conexão

Realizando a criação de um usuário para o Contained Database..

 

USE ContainedDatabase

GO

 

CREATE USER UsrContainedDatabase WITH PASSWORD = N’Dados1234567′

GO

 

ALTER ROLE [db_datareader] ADD MEMBER UsrContainedDatabase

Ou se preferir…

 

Capture

(Figura 4 – Criando um usuário para o Contained Database.)

É possível criar um login do windows, para isso na hora da criação faça o seguinte..

 

image

(Figura 4 – Criando um usuário windows, sendo assim não é necessário especificar um login.)

 

Agora  com o usuário criado iremos realizar o acesso ao Contained Database. Realizando acesso, vemos que:

 

image

(Figura 5 – Erro para o login.)

 

Bem, realmente esse erro é para ocorrer, isso porque de fato não temos nenhum login criado com esse nome, na verdade temos um usuário, então para que seja possível você realizar o acesso do Contained Database, você dever fazer o seguinte…

 

Capture

(Passo 1)

 

Capture

(Passo 2)

 

image

(Figura 6 – Visualizando somente o banco de dados ContainedDatabase.)

 

Pronto sua conexão foi bem sucedida com o Contained Database.

Se desejar ver todos os Contained Users use…

 

SELECT name, type_desc, default_schema_name, create_date, authentication_type_desc

FROM sys.database_principals

WHERE authentication_type = 2

image

(Figura 7 – Contained Users)

Fonte

http://msdn.microsoft.com/en-us/library/ff929071.aspx