Bancos de dados contidos

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do Azure

Um banco de dados independente é um banco de dados isolado de outros bancos de dados e da instância do SQL Server que hospeda o banco de dados. O SQL Server ajuda o usuário a isolar seu banco de dados da instância de 4 maneiras.

  • A maioria dos metadados que descrevem um banco de dados é mantida no banco de dados. (Além de, ou em vez de, manter os metadados no banco de dados mestre.)

  • Todos os metadados são definidos com a mesma regra de agrupamento.

  • A autenticação de usuário pode ser executada pelo banco de dados, reduzindo a dependência dos bancos de dados dos logons da instância do SQL Server.

  • O ambiente do SQL Server (DMV's, XEvents, etc.) fornece relatórios sobre informações de contenção e pode agir com base nelas.

Alguns recursos de bancos de dados parcialmente independentes, como armazenar metadados no banco de dados, aplicam-se a todos os bancos de dados SQL Server. Alguns benefícios dos bancos de dados parcialmente contidos, como a autenticação no nível do banco de dados e o agrupamento do catálogo, devem ser habilitados antes de estarem disponíveis. A contenção parcial é habilitada usando as instruções CREATE DATABASE e ALTER DATABASE ou usando o SQL Server Management Studio. Para obter mais informações sobre como habilitar a contenção parcial de bancos de dados, consulte Migrate to a Partially Contained Database.

Conceitos de banco de dados parcialmente contido

Um banco de dados totalmente independente inclui todas as configurações e metadados necessários para definir o banco de dados e não tem nenhuma dependência de configuração da instância do Mecanismo de Banco de Dados do SQL Server onde o banco de dados está instalado. Em versões anteriores do SQL Server, separar um banco de dados da instância do SQL Server poderia ser demorado e exigir conhecimento detalhado da relação entre o banco de dados e a instância do SQL Server. Os bancos de dados parcialmente contidos facilitam a separação de um banco de dados da instância do SQL Server e de outros bancos de dados.

O banco de dados contido considera as funcionalidades no que diz respeito à contenção. Qualquer entidade definida pelo usuário que confie apenas em funções que residem no banco de dados é considerada totalmente contida. Qualquer entidade definida pelo usuário que depende de funções que residem fora do banco de dados é considerada não contida. (Para obter mais informações, consulte a seção Contenção mais adiante neste tópico.)

Os termos a seguir se aplicam ao modelo de banco de dados independente.

Limite de banco de dados
O limite entre um banco de dados e a instância do SQL Server. O limite entre um banco de dados e outros bancos de dados.

Contido
Um elemento que existe completamente no limite de banco de dados.

Sem contenção
Um elemento que cruza o limite de banco de dados.

banco de dados não contido
Um banco de dados com contenção definida como NONE. Todos os bancos de dados em versões anteriores ao SQL Server 2012 (11.x) não são contidos. Por padrão, todos os bancos de dados SQL Server 2012 (11.x) e posteriores têm um conjunto de contenção definido como NONE.

Banco de dados parcialmente contido
Um banco de dados parcialmente independente é um banco de dados independente que permite que alguns recursos cruzem o limite de banco de dados. O SQL Server inclui a capacidade de determinar quando o limite de retenção é cruzado.

Usuário contido
Há dois tipos de usuários de bancos de dados independentes.

  • Usuário de banco de dados independente com senha

    Usuários de banco de dados contido com senhas são autenticados pelo banco de dados. Para obter mais informações, consulte Usuários de bancos de dados independentes – Tornando seu banco de dados portátil.

  • identidades de segurança do Windows

    Usuários autorizados do Windows e membros de grupos autorizados do Windows podem conectar-se diretamente ao banco de dados e não precisam de logons no banco de dados mestre . O banco de dados confia na autenticação pelo Windows.

Usuários associados a logons no banco de dados master podem receber acesso a um banco de dados contido, mas isso criaria uma dependência da instância do SQL Server. Portanto, criar usuários com base em logins requer contenção parcial.

Importante

Habilitar bancos de dados parcialmente contidos delega o controle do acesso à instância do SQL Server aos proprietários do banco de dados. Para obter mais informações, consulte Security Best Practices with Contained Databases.

Limite de banco de dados
Como os bancos de dados parcialmente contidos separam a funcionalidade do banco de dados das funcionalidades da instância, há uma linha claramente definida entre esses dois elementos, chamada de limite do banco de dados.

Dentro do limite de banco de dados está o modelo de banco de dados, onde os bancos de dados são desenvolvidos e gerenciados. Exemplos de entidades localizadas dentro do banco de dados incluem, tabelas do sistema como sys.tables, usuários de banco de dados contido com senhas e tabelas de usuário no banco de dados atual referenciadas por um nome em duas partes.

Fora do limite de banco de dados está o modelo de gerenciamentoque pertence às funções e ao gerenciamento em nível da instância. Exemplos de entidades localizadas fora do limite de banco de dados incluem tabelas do sistema, como sys.endpoints, usuários mapeados para logons e tabelas de usuário em outro banco de dados referenciadas por um nome de três partes.

Contenção

Entidades de usuário que residem inteiramente dentro do banco de dados são consideradas contidas. Qualquer entidade que resida fora do banco de dados ou que dependa da interação com funções fora do banco de dados é considerada como não contida.

Em geral, entidades de usuário entram nas seguintes categorias de contenção:

  • Entidades de usuário totalmente contidas (que nunca cruzam o limite de banco de dados), por exemplo sys.indexes. Qualquer código que use esses recursos ou qualquer objeto que faça referência apenas a essas entidades também é totalmente contido.

  • Entidades de usuário não contidas (que cruzam o limite de banco de dados), por exemplo, sys.server_principals ou a própria entidade de servidor (logon). Qualquer código que use essas entidades ou qualquer função que faça referência a essas entidades não está contido.

Banco de dados parcialmente contido

Atualmente, o recurso de banco de dados contido está disponível apenas em um estado de contenção parcial. Um banco de dados parcialmente contido é um banco de dados independente que permite o uso de recursos não contidos.

Use as exibições sys.dm_db_uncontained_entities e sys.sql_modules (Transact-SQL) para retornar informações sobre objetos ou recursos não contidos. Ao determinar o status de contenção dos elementos do seu banco de dados, você pode descobrir quais objetos ou funcionalidades devem ser substituídos ou alterados para promover a contenção.

Importante

Como determinados objetos têm uma configuração de contenção padrão de NONE, essa exibição pode retornar falsos positivos.

O comportamento de bancos de dados parcialmente contidos difere mais claramente do comportamento de bancos de dados não contidos em relação ao agrupamento. Para obter mais informações sobre problemas de ordenação, consulte Ordenações de bancos de dados independentes.

Benefícios de usar bancos de dados parcialmente contidos

Há problemas e complicações associados a bancos de dados não contidos que podem ser resolvidos por meio de um banco de dados parcialmente contido.

Movimentação do banco de dados

Um dos problemas que ocorre ao mover bancos de dados é que algumas informações importantes podem não estar disponíveis quando um banco de dados é movido de uma instância a outra. Por exemplo, as informações de logon são armazenadas na instância e não no banco de dados. Ao mover um banco de dados não contido de uma instância para outra instância do SQL Server, essas informações ficam para trás. Você deve identificar as informações ausentes e movê-las com seu banco de dados para a nova instância do SQL Server . Esse processo pode ser difícil e demorado.

O banco de dados parcialmente independente pode armazenar informações importantes no banco de dados para que o banco de dados ainda contenha as informações depois de ser movido.

Observação

Um banco de dados parcialmente contido pode fornecer documentação que descreve os recursos usados por um banco de dados que não podem ser separados da instância. Isso inclui uma lista de outros bancos de dados relacionados, configurações do sistema exigidas pelo banco de dados, mas que não podem ser contidas, e assim por diante.

Benefício de usuários de banco de dados independentes com AlwaysOn

Ao reduzir a dependência da instância do SQL Server, os bancos de dados parcialmente contidos podem ser úteis durante o failover ao usar grupos de disponibilidade Always On.

Criar usuários contidos permite que o usuário se conecte diretamente ao banco de dados contido. Este é um recurso muito significativo em cenários de alta disponibilidade e recuperação de desastres como em uma solução AlwaysOn. Se os usuários forem usuários contidos, em caso de failover, seria possível conectar-se à réplica secundária sem criar logins na instância que a hospeda. Isto fornece um benefício imediato. Para obter mais informações, consulte Visão geral dos Grupos de Disponibilidade AlwaysOn (SQL Server) e Pré-requisitos, restrições e recomendações para Grupos de Disponibilidade AlwaysOn (SQL Server).

Desenvolvimento inicial de bancos de dados

Como um desenvolvedor talvez não saiba onde um novo banco de dados será implantado, a limitação dos impactos no ambiente implantados no banco de dados reduz o trabalho e a preocupação do desenvolvedor. No modelo não contido, o desenvolvedor deve considerar os possíveis impactos no ambiente no novo banco de dados e programa de maneira correspondente. No entanto, ao usar bancos de dados parcialmente contidos, os desenvolvedores podem detectar impactos no nível da instância sobre o banco de dados e questões no nível da instância relevantes para o desenvolvedor.

Administração de banco de dados

Manter as configurações de banco de dados no banco de dados, e não no banco de dados mestre, permite que o proprietário de cada banco de dados tenha mais controle sobre seu banco de dados, sem conceder a eles a permissão sysadmin .

Limitações

Bancos de dados parcialmente contidos não dão suporte aos seguintes recursos.

  • Replicação, captura de dados de alterações ou controle de alterações.

  • Procedimentos numerados

  • Objetos vinculados ao esquema que dependem de funções internas com alterações no agrupamento

  • Alteração de associação resultante de alterações de ordenação, inclusive referências a objetos, colunas, símbolos ou tipos.

Aviso

Os procedimentos armazenados temporários são atualmente permitidos. Como os procedimentos armazenados temporários quebram o isolamento, não se espera que sejam suportados em versões futuras de bancos de dados contidos.

Identificando a contenção do banco de dados

Há duas ferramentas para facilitar a identificação do status de contenção do banco de dados. A sys.dm_db_uncontained_entities (Transact-SQL) é uma exibição que mostra todas as entidades potencialmente não contidas no banco de dados. O evento database_uncontained_usage ocorre quando qualquer entidade não contida real é identificada em tempo de execução.

sys.dm_db_uncontained_entities

Esta exibição mostra as entidades do banco de dados que têm potencial para não serem contidas, como aquelas que cruzam o limite de banco de dados. Isso inclui as entidades de usuário que possam usar objetos fora do modelo de banco de dados. Porém, como a contenção de algumas entidades (por exemplo, as que usam SQL dinâmico) não pode ser determinada até o tempo de execução, a exibição poderá mostrar algumas entidades que não estão contidas realmente. Para obter mais informações, consulte sys.dm_db_uncontained_entities (Transact-SQL).

evento database_uncontained_usage

Esse XEvent ocorre sempre que uma entidade sem contenção é identificada em tempo de execução. Isso inclui entidades originadas no código de cliente. Esse XEvent ocorrerá apenas para entidades efetivamente não contidas em contêiner. No entanto, o evento ocorre somente no momento de execução. Portanto, quaisquer usuários não contidos que você não executou não serão identificados por este XEvent.

Confira também

Recursos modificados (banco de dados contido)
Ordenações de banco de dados independentes
Práticas recomendadas de segurança com bancos de dados independentes
Migrar para um banco de dados parcialmente independente
Usuários de Banco de Dados Contido - Tornando Seu Banco de Dados Portável