Idioma

Instâncias de usuário do SQL Server Express

SQL Server Express Edition dá suporte ao recurso de instância do usuário. Use o pacote NuGet Microsoft.Data.SqlClient para clientes autônomos no Windows. Uma instância de usuário é uma instância separada do Mecanismo de Banco de Dados do SQL Server Express gerada por uma instância pai. As instâncias de usuário permitem que os usuários que não são administradores nos computadores locais deles anexem bancos de dados do SQL Server Express e se conectem a eles. Cada instância é executada no contexto de segurança do usuário individual, uma instância por usuário.

Recursos de instância de usuário

As instâncias de usuário são úteis para usuários que executam o Windows em uma LUA (conta de privilégios mínimos). Cada usuário possui os privilégios de administrador de sistema do SQL Server (sysadmin) sobre a instância em execução no computador sem a necessidade de executar também como um administrador do Windows. O software em execução em uma instância de usuário com permissões limitadas não pode realizar alterações em todo o sistema porque a instância do SQL Server Express está em execução na conta do Windows que não é de administrador do usuário, não como um serviço. Cada instância de usuário é isolada de sua instância pai e de qualquer outra instância de usuário que estiver em execução no mesmo computador. Os bancos de dados em execução em uma instância de usuário são abertos somente no modo de usuário único. Não é possível a conexão de vários usuários a bancos de dados em execução em uma instância de usuário. A replicação e as consultas distribuídas também são desabilitadas para instâncias de usuário.

Observação

As instâncias de usuário não são necessárias para usuários que já são administradores nos próprios computadores ou para cenários que envolvam vários usuários de banco de dados.

Habilitar instâncias de usuário

Para gerar instâncias de usuário, uma instância pai do SQL Server Express deve estar em execução. As instâncias de usuário são habilitadas por padrão quando o SQL Server Express está instalado e podem ser explicitamente habilitadas ou desabilitadas por um administrador do sistema executando o procedimento armazenado do sp_configure sistema na instância pai.

-- Enable user instances.
sp_configure 'user instances enabled','1'

-- Disable user instances.
sp_configure 'user instances enabled','0'

O protocolo de rede das instâncias de usuário só podem ser Pipes Nomeados. Uma instância de usuário não pode ser iniciada em uma instância remota do SQL Server e não são permitidos logons do SQL Server.

Conectar a uma instância de usuário

As palavras-chave User Instance e AttachDBFilenameConnectionString permitem que o SqlConnection se conecte a uma instância do usuário. As propriedades UserInstance e AttachDBFilename também dão suporte a instâncias de usuário.

Considere a seguinte cadeia de conexão.

Data Source=.\\SQLExpress;Integrated Security=true;
User Instance=true;AttachDBFilename=|DataDirectory|\InstanceDB.mdf;
Initial Catalog=InstanceDB;
Encrypt=true;TrustServerCertificate=true;

Nessa cadeia de conexão:

  • Encrypt=true;TrustServerCertificate=true criptografa a conexão sem validar o certificado do servidor local. Use essa configuração somente para desenvolvimento local com uma instância que não tenha um certificado confiável.
  • A palavra-chave Data Source se refere à instância pai do SQL Server Express que está gerando a instância de usuário. A instância padrão é .\sqlexpress.
  • Integrated Security é definido como true. Para se conectar a uma instância de usuário, é preciso autenticar-se no Windows; não há suporte para logons do SQL Server.
  • O User Instance é definido como true, que invoca uma instância de usuário. (O padrão é false.)
  • A AttachDbFileName palavra-chave cadeia de conexão anexa o arquivo de banco de dados primário (.mdf) e requer o caminho completo. A SqlConnection cadeia de conexão também aceita os aliases "propriedades estendidas" e "nome do arquivo inicial".
  • A cadeia de caracteres de substituição |DataDirectory| incluída nos símbolos de pipe refere-se ao diretório de dados do aplicativo que abre a conexão e fornece um caminho relativo que indica a localização dos arquivos de banco de dados .mdf e .ldf e de log. Se desejar localizar esses arquivos em outro lugar, você deverá fornecer o caminho completo para os arquivos.

Observação

Você também pode usar as propriedades SqlConnectionStringBuilder.UserInstance e SqlConnectionStringBuilder.AttachDBFilename para criar uma cadeia de conexão em tempo de execução.

Importante

A Microsoft recomenda usar o fluxo de autenticação mais seguro disponível. Se você estiver se conectando ao SQL do Azure, as Identidades gerenciadas para recursos do Azure é o método de autenticação recomendado.

Usando a string de substituição |DataDirectory|

AttachDbFileName foi ampliado no ADO.NET 2.0 com a introdução da cadeia de caracteres de substituição |DataDirectory| (entre barras verticais). DataDirectory é usado em conjunto com AttachDbFileName para indicar um caminho relativo para um arquivo de dados, permitindo que os desenvolvedores criem cadeias de conexão baseadas em um caminho relativo para a fonte de dados em vez precisarem especificar um caminho completo.

A localização física para a qual DataDirectory aponta depende do tipo de aplicativo. Neste exemplo, o arquivo Northwind.mdf a ser anexado está localizado na pasta \app_data do aplicativo.

Data Source=.\\SQLExpress;Integrated Security=true;
User Instance=true;
AttachDBFilename=|DataDirectory|\app_data\Northwind.mdf;
Initial Catalog=Northwind;
Encrypt=true;TrustServerCertificate=true;

Quando DataDirectory é usado, o caminho do arquivo resultante não pode ser maior na estrutura de diretório do que o diretório apontado pela cadeia de caracteres de substituição. Por exemplo, se o DataDirectory totalmente expandido for C:\AppDirectory\app_data, a cadeia de conexão de exemplo mostrada acima funcionará porque está embaixo de c:\AppDirectory. No entanto, tentar especificar DataDirectory como |DataDirectory|\..\data resultará em um erro porque \data não é um subdiretório de \AppDirectory.

Se a cadeia de conexão tiver uma cadeia de caracteres de substituição formatada incorretamente, uma ArgumentException será gerada.

Observação

Microsoft.Data.SqlClient resolve as strings de substituição em caminhos completos no sistema de arquivos do computador local. Portanto, não há suporte para servidor remoto, HTTP e nomes de caminho UNC. Uma exceção será gerada quando a conexão for aberta se o servidor não estiver localizado no computador local.

Quando SqlConnection é aberto, ele é redirecionado da instância do SQL Server Express padrão para uma instância iniciada em runtime que esteja sendo executada na conta do chamador.

Observação

Como as instâncias de usuário podem levar mais tempo para serem carregadas, aumente o tempo limite da conexão, se necessário. Para obter mais informações, consulte ConnectionTimeout.

O fragmento de código a seguir abre uma nova SqlConnection, exibe a cadeia de conexão na janela do console e fecha a conexão ao sair do bloco de código de using.

Private Sub OpenSqlConnection()
    ' Retrieve the connection string.
    Dim connectionString As String = GetConnectionString()

    Using connection As New SqlConnection(connectionString)
        connection.Open()
        Console.WriteLine("ConnectionString: {0}", _
           connection.ConnectionString)
    End Using
End Sub
private static void OpenSqlConnection()
{
    // Retrieve the connection string.
    string connectionString = GetConnectionString();

    using (SqlConnection connection =
        new SqlConnection(connectionString))
    {
        connection.Open();
        Console.WriteLine("ConnectionString: {0}",
             connection.ConnectionString);
    }
}

Observação

Não há suporte para instâncias de usuário no código CLR (Common Language Runtime) executado dentro de SQL Server. O acesso CLR em processo do SQL usa System.Data.SqlClient, não Microsoft.Data.SqlClient.

Tempo de vida de uma conexão de instância de usuário

Diferentemente das versões de SQL Server executadas como um serviço, as instâncias do SQL Server Express não precisam ser iniciadas nem interrompidas manualmente. Sempre que um usuário fizer logon e se conectar a uma instância de usuário, ela será iniciada se ainda não estiver em execução. Os bancos de dados da instância de usuário têm a opção AutoClose definida para que o banco de dados seja desligado automaticamente após um período de inatividade. O processo sqlservr.exe iniciado será mantido em execução durante um período de tempo limite limitado depois que a última conexão com a instância for fechada; portanto, não será necessário reiniciá-la se outra conexão for aberta antes que o tempo limite tenha expirado. A instância de usuário será desligada automaticamente se nenhuma nova conexão for aberta antes que esse período de tempo limite tenha expirado. Um administrador do sistema na instância pai pode definir a duração do período de tempo limite para uma instância de usuário usando sp_configure para alterar a opção user instance timeout . O padrão é de 60 minutos.

Observação

Se Min Pool Size for usado na cadeia de conexão com um valor maior que zero, o pooler de conexão sempre manterá algumas conexões abertas e a instância do usuário não será desligada automaticamente.

Como as instâncias de usuário funcionam

Na primeira vez que uma instância de usuário é gerada para cada usuário, os bancos de dados do sistema master e msdb são copiados da Pasta de Dados de Modelo para um caminho no diretório de dados do aplicativo local do usuário para uso exclusivo pela instância do usuário. O caminho geralmente é C:\Documents and Settings\<UserName>\Local Settings\Application Data\Microsoft\Microsoft SQL Server Data\SQLEXPRESS. Quando uma instância do usuário é iniciada, o tempdb, o log e os arquivos de rastreamento também são gravados nesse diretório. Um nome é gerado para a instância, que tem a garantia de ser única para cada usuário.

Por padrão, todos os membros do grupo Builtin\Users do Windows recebem permissões para conectar-se na instância local, assim como permissões de leitura e execução nos binários do SQL Server. Depois que as credenciais do usuário chamador que hospeda a instância de usuário tiverem sido verificadas, o usuário se tornará o sysadmin nessa instância. Somente a memória compartilhada está habilitada para instâncias de usuário, o que significa que são possíveis apenas operações no computador local.

Os usuários devem receber permissões de leitura e gravação nos arquivos .mdf e .ldf especificados na cadeia de conexão.

Observação

Os arquivos .mdf e .ldf representam o banco de dados e os arquivos de log, respectivamente. Esses dois arquivos são um conjunto correspondente; portanto, tome cuidado durante operações de backup e restauração. O arquivo de banco de dados contém informações sobre a versão exata do arquivo de log. O banco de dados não será aberto se for acoplado com o arquivo de log errado.

Para evitar dados corrompidos, um banco de dados na instância de usuário é aberto com acesso exclusivo. Se duas instâncias de usuário diferentes compartilharem o mesmo banco de dados no mesmo computador, o usuário na primeira instância deverá fechar o banco de dados antes que ele possa ser aberto em uma segunda instância.

Cenários de instância de usuário

As instâncias de usuário fornecem aos desenvolvedores de aplicativos de banco de dados um armazenamento de dados do SQL Server que não depende de os desenvolvedores terem contas administrativas nos computadores de desenvolvimento deles. As instâncias de usuário são baseadas no modelo Access/Jet, em que o aplicativo de banco de dados simplesmente se conecta a um arquivo e o usuário tem automaticamente permissões completas sobre todos os objetos de banco de dados sem precisar de intervenção de um administrador do sistema para conceder permissões. Ele se destina a funcionar em situações nas quais o usuário está em execução em uma LUA (conta de usuário com privilégios mínimos) e não tem privilégios administrativos no servidor ou no computador local, mas que precisa criar aplicativos e objetos de banco de dados. As instâncias de usuário permitem que os usuários criem instâncias em runtime que são executadas no contexto de segurança do próprio usuário e não no contexto de segurança de um serviço de sistema mais privilegiado.

Importante

As instâncias de usuário só devem ser usadas em cenários nos quais todos os aplicativos que as usam são totalmente confiáveis.

Os cenários de instância de usuário incluem:

  • Qualquer aplicativo de usuário único em que não é necessário compartilhar dados.

  • Implantação do ClickOnce. Se o .NET Framework 2.0 (ou posterior) e o SQL Server Express já estiverem instalados no computador de destino, o pacote de instalação baixado como resultado de uma ação ClickOnce poderá ser instalado e usado por usuários não administradores. Observe que um administrador deverá instalar o SQL Server Express se ele fizer parte da instalação. Para obter mais informações, confira Implantação do ClickOnce para Windows Forms.

  • Hospedagem ASP.NET dedicada usando a Autenticação do Windows. Uma só instância do SQL Server Express pode ser hospedada em uma intranet. O aplicativo não se conecta usando a personificação, mas sim usando a conta do Windows do ASPNET. As instâncias de usuário não devem ser usadas para cenários de hospedagem compartilhada ou de terceiros em que todos os aplicativos compartilhariam a mesma instância de usuário e não permaneceriam mais isolados uns dos outros.

Confira também