Partilhar via


Instâncias de usuário do SQL Server Express

O Microsoft SQL Server Express Edition (SQL Server Express) oferece suporte ao recurso de instância do usuário, que só está disponível ao usar o Provedor de Dados do .NET Framework para SQL Server (SqlClient). Uma instância de usuário é uma instância separada do Mecanismo de Banco de Dados do SQL Server Express que é gerada por uma instância pai. As instâncias de usuário permitem que usuários que não são administradores em seus computadores locais anexem e se conectem a bancos de dados do SQL Server Express. Cada instância é executada sob o contexto de segurança do usuário individual, em uma instância por usuário.

Recursos de instância do usuário

As instâncias de usuário são úteis para usuários que executam o Windows em uma conta de usuário de privilégios mínimos (LUA). Cada usuário tem privilégios de administrador de sistema (sysadmin) do SQL Server sobre a instância em execução em seu computador sem precisar executar como administrador do Windows também. O software executado em uma instância de usuário com permissões limitadas não pode fazer alterações em todo o sistema porque a instância do SQL Server Express está sendo executada na conta do Windows não administrador do usuário, não como um serviço. Cada instância de usuário é isolada de sua instância pai e de quaisquer outras instâncias de usuário em execução no mesmo computador. Os bancos de dados em execução em uma instância de usuário são abertos apenas no modo de usuário único e não é possível que vários usuários se conectem 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.

Nota

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

Habilitando 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 é instalado e podem ser explicitamente habilitadas ou desabilitadas por um administrador de sistema que executa o procedimento armazenado do sistema sp_configure 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 para instâncias de usuário deve ser Named Pipes local. Uma instância de usuário não pode ser iniciada em uma instância remota do SQL Server e logons do SQL Server não são permitidos.

Conectando-se a uma instância de usuário

As User Instance palavras-chave e AttachDBFilenameConnectionString permitem que a SqlConnection se conecte a uma instância de usuário. As instâncias de usuário também são suportadas SqlConnectionStringBuilderUserInstance pelas propriedades e AttachDBFilename .

Observe o seguinte sobre a cadeia de conexão de exemplo mostrada abaixo:

  • A Data Source palavra-chave refere-se à instância pai do SQL Server Express que está gerando a instância do usuário. A instância padrão é .\sqlexpress.

  • Integrated Security está definido como true. Para se conectar a uma instância de usuário, a Autenticação do Windows é necessária; 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 da cadeia de conexão é usada para anexar o arquivo de banco de dados primário (.mdf), que deve incluir o nome completo do caminho. AttachDbFileName também corresponde às chaves "propriedades estendidas" e "nome de arquivo inicial" dentro de uma cadeia de SqlConnection conexão.

  • A |DataDirectory| cadeia de caracteres de substituição 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 indicando o local dos arquivos de log e banco de dados .mdf e .ldf. Se você quiser localizar esses arquivos em outro lugar, você deve fornecer o caminho completo para os arquivos.

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

Nota

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

Utilizar a seringa |Diretório de dados| String de substituição

AttachDbFileName foi ampliada em ADO.NET 2.0 com a introdução da cadeia de substituição (encerrada em símbolos de |DataDirectory| tubo). 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 de serem obrigados a especificar um caminho completo.

A localização física para a qual DataDirectory aponta depende do tipo de aplicação. Neste exemplo, o arquivo de 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;  

Quando DataDirectory é usado, o caminho do arquivo resultante não pode ser maior na estrutura de diretórios do que o diretório apontado pela cadeia de substituição. Por exemplo, se o totalmente expandido DataDirectory for C:\AppDirectory\app_data, a cadeia de conexão de exemplo mostrada acima funcionará porque está abaixo 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 substituição formatada incorretamente, uma ArgumentException será lançada.

Nota

System.Data.SqlClient Resolve as cadeias de caracteres de substituição em caminhos completos no sistema de arquivos do computador local. Portanto, não há suporte para nomes de caminho de servidor remoto, HTTP e UNC. Uma exceção é lançada quando a conexão é aberta se o servidor não estiver localizado no computador local.

Quando o SqlConnection é aberto, ele é redirecionado da instância padrão do SQL Server Express para uma instância iniciada em tempo de execução em execução na conta do chamador.

Nota

Pode ser necessário aumentar o valor, uma vez que as ConnectionTimeout instâncias de usuário podem levar mais tempo para carregar do que as instâncias regulares.

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

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);  
    }  
}  

Nota

Não há suporte para instâncias de usuário no código CLR (Common Language Runtime) que está sendo executado dentro do SQL Server. Um InvalidOperationException é lançado se Open for chamado em um SqlConnection que tem User Instance=true na cadeia de conexão.

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

Ao contrário das versões do SQL Server que são executadas como um serviço, as instâncias do SQL Server Express não precisam ser iniciadas e interrompidas manualmente. Sempre que um usuário efetua login e se conecta a uma instância de usuário, a instância de usuário é iniciada se ainda não estiver em execução. Os bancos de dados de instância de usuário têm a AutoClose opção definida para que o banco de dados seja desligado automaticamente após um período de inatividade. O processo de sqlservr.exe iniciado é mantido em execução por um período de tempo limite limitado após o fechamento da última conexão com a instância, portanto, não precisa ser reiniciado se outra conexão for aberta antes que o tempo limite tenha expirado. A instância do usuário será desligada automaticamente se nenhuma nova conexão for aberta antes que o período de tempo limite tenha expirado. Um administrador de 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 de tempo limite da instância do usuário. O padrão é 60 minutos.

Nota

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

Como funcionam as instâncias de usuário

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 Dados do Modelo para um caminho no diretório do repositório de dados do aplicativo local do usuário para uso exclusivo pela instância do usuário. Este caminho é tipicamente C:\Documents and Settings\<UserName>\Local Settings\Application Data\Microsoft\Microsoft SQL Server Data\SQLEXPRESS. Quando uma instância de usuário é iniciada, os arquivos tempdb, log e trace também são gravados nesse diretório. Um nome é gerado para a instância, que é garantido ser exclusivo para cada usuário.

Por padrão, todos os membros do grupo Windows Builtin\Users recebem permissões para se conectar na instância local, bem 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 do usuário tiverem sido verificadas, esse usuário se tornará o sysadmin nessa instância. Somente a memória compartilhada é habilitada para instâncias de usuário, o que significa que apenas operações na máquina local são possíveis.

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

Nota

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, é preciso ter cuidado durante as 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, e o banco de dados não será aberto se estiver acoplado ao arquivo de log errado.

Para evitar corrupção de dados, um banco de dados na instância do 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 do 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 desenvolvedores que tenham contas administrativas em seus computadores de desenvolvimento. As instâncias de usuário são baseadas no modelo Access/Jet, onde o aplicativo de banco de dados simplesmente se conecta a um arquivo e o usuário automaticamente tem permissões totais em todos os objetos de banco de dados sem precisar da intervenção de um administrador de sistema para conceder permissões. Destina-se a funcionar em situações em que o usuário está executando sob uma conta de usuário de privilégios mínimos (LUA) e não tem privilégios administrativos no servidor ou na máquina local, mas precisa criar objetos e aplicativos de banco de dados. As instâncias de usuário permitem que os usuários criem instâncias em tempo de execução que são executadas sob o próprio contexto de segurança do 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 em que todos os aplicativos que as usam são totalmente confiáveis.

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

  • Qualquer aplicação de utilizador único em que a partilha de dados não seja necessária.

  • 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 deve instalar o SQL Server Express se isso fizer parte da instalação. Para obter mais informações, consulte Implantação do ClickOnce para Windows Forms.

  • Hospedagem ASP.NET dedicada usando a Autenticação do Windows. Uma única instância do SQL Server Express pode ser hospedada em uma intranet. O aplicativo se conecta usando a conta ASPNET do Windows, não usando representação. 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.

Consulte também