Instâncias de usuário do SQL Server ExpressSQL Server Express User Instances

O Microsoft SQL Server Express Edition (SQL Server Express) dá suporte ao recurso de instância de usuário, que somente está disponível quando é usado o Provedor de Dados .NET Framework para SQL Server (SqlClient).Microsoft SQL Server Express Edition (SQL Server Express) supports the user instance feature, which is only available when using the .NET Framework Data Provider for SQL Server (SqlClient). Uma instância de usuário é uma instância separada do Mecanismo de Banco de Dados SQL Server Express que é gerado por uma instância pai.A user instance is a separate instance of the SQL Server Express Database Engine that is generated by a parent instance. As instâncias de usuário permitem que usuários que não são administradores em seus computadores locais anexem e conectem-se aos bancos de dados SQL Server Express.User instances allow users who are not administrators on their local computers to attach and connect to SQL Server Express databases. Cada instância é executada no contexto de segurança do usuário individual, uma instância por usuário.Each instance runs under the security context of the individual user, on a one-instance-per-user basis.

Recursos de instância de usuárioUser Instance Capabilities

As instâncias de usuário são úteis para os usuários que estão executando o Windows com uma conta de usuário de privilégios mínimos (LUA), pois cada usuário tem privilégios de administrador do sistema do SQL Server (sysadmin) na instância em execução em seu computador sem precisar ser também administrador do Windows.User instances are useful for users who are running Windows under a least-privilege user account (LUA) because each user has SQL Server system administrator (sysadmin) privileges over the instance running on her computer without needing to run as a Windows administrator as well. O software que é 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 usuário do Windows que não é administrador, não como um serviço.Software executing on a user instance with limited permissions cannot make system-wide changes because the instance of SQL Server Express is running under the non-administrator Windows account of the user, not as a service. Cada instância de usuário é isolada de sua instância pai e de todas as outras instâncias de usuário que são executadas no mesmo computador.Each user instance is isolated from its parent instance and from any other user instances running on the same computer. Os bancos de dados que são executados em uma instância de usuário são abertos somente no modo de usuário único, e não é possível para vários usuários se conectarem a bancos de dados que são executados em uma instância de usuário.Databases running on a user instance are opened in single-user mode only, and it is not possible for multiple users to connect to databases running on a user instance. A replicação e as consultas distribuídas também são desativadas para instâncias de usuário.Replication and distributed queries are also disabled for user instances.

Para obter mais informações, consulte “Instâncias de usuário” nos Manuais Online do SQL Server.For more information, see "User Instances" in SQL Server Books Online.

Observação

As instâncias de usuário não são necessárias para os usuários que já são administradores em seus próprios computadores ou para cenários que envolvem vários usuários do banco de dados.User instances are not needed for users who are already administrators on their own computers, or for scenarios involving multiple database users.

Habilitando instâncias de usuárioEnabling User Instances

Para gerar instâncias de usuário, uma instância pai do SQL Server Express deve estar em execução.To generate user instances, a parent instance of SQL Server Express must be running. As instâncias de usuário são habilitadas por padrão quando SQL Server Express é instalado e podem ser explicitamente habilitadas ou desabilitadas por um administrador do sistema executando o procedimento armazenado do sistema sp_configure na instância pai.User instances are enabled by default when SQL Server Express is installed, and they can be explicitly enabled or disabled by a system administrator executing the sp_configure system stored procedure on the parent instance.

-- 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 o Pipes Nomeados local.The network protocol for user instances must be local Named Pipes. Uma instância de usuário não pode ser iniciada em uma instância remota do SQL Server e os logons do SQL Server não são permitidos.A user instance cannot be started on a remote instance of SQL Server, and SQL Server logins are not allowed.

Conectando-se a uma instância de usuárioConnecting to a User Instance

As User Instance palavras AttachDBFilename -chave e ConnectionString permitem que SqlConnection um se conecte a uma instância de usuário.The User Instance and AttachDBFilenameConnectionString keywords allow a SqlConnection to connect to a user instance. As instâncias de usuário também têm o suporte das propriedades SqlConnectionStringBuilderUserInstance e AttachDBFilename.User instances are also supported by the SqlConnectionStringBuilderUserInstance and AttachDBFilename properties.

Observe o seguinte sobre a cadeia de conexão no exemplo mostrado abaixo:Note the following about the sample connection string shown below:

  • A palavra-chave Data Source refere-se à instância pai do SQL Server Express que está gerando a instância do usuário.The Data Source keyword refers to the parent instance of SQL Server Express that is generating the user instance. A instância padrão é .\sqlexpress.The default instance is .\sqlexpress.

  • Integrated Security é definido como true.Integrated Security is set to true. Para se conectar a uma instância de usuário, a Autenticação do Windows é necessária; os logons do SQL Server não têm suporte.To connect to a user instance, Windows Authentication is required; SQL Server logins are not supported.

  • A User Instance é definida como true, o que invoca uma instância de usuário.The User Instance is set to true, which invokes a user instance. (O padrão é false.)(The default is false.)

  • A palavra-chave de cadeia de conexão AttachDbFileName é usada para anexar o arquivo de banco de dados primário (.mdf), que deve incluir o nome do caminho completo.The AttachDbFileName connection string keyword is used to attach the primary database file (.mdf), which must include the full path name. AttachDbFileName também corresponde às chaves "extended properties" e "initial file name" dentro de uma cadeia de conexão SqlConnection.AttachDbFileName also corresponds to the "extended properties" and "initial file name" keys within a SqlConnection connection string.

  • A cadeia de caracteres de substituição |DataDirectory| incluída nos símbolos pipe refere-se ao diretório de dados do aplicativo que abre a conexão e fornece um caminho relativo que indica o local do banco de dados .mdf e .ldf e dos arquivos de log.The |DataDirectory| substitution string enclosed in the pipe symbols refers to the data directory of the application opening the connection and provides a relative path indicating the location of the .mdf and .ldf database and log files. Se você deseja localizar esses arquivos em outro lugar, deverá fornecer o caminho completo para os arquivos.If you want to locate these files elsewhere, you must provide the full path to the files.

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

Observação

Você também pode usar as propriedades SqlConnectionStringBuilderUserInstance e AttachDBFilename para compilar uma cadeia de conexão em tempo de execução.You can also use the SqlConnectionStringBuilderUserInstance and AttachDBFilename properties to build a connection string at run time.

Usando a |cadeia de caracteres| de substituição DataDirectoryUsing the |DataDirectory| Substitution String

AttachDbFileName foi ampliado no ADO.NET 2.0 com a introdução da cadeia de caracteres de substituição |DataDirectory| (entre barras verticais).AttachDbFileName was extended in ADO.NET 2.0 with the introduction of the |DataDirectory| (enclosed in pipe symbols) substitution string. 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 que são baseadas em um caminho relativo para a fonte de dados em vez de precisarem especificar um caminho completo.DataDirectory is used in conjunction with AttachDbFileName to indicate a relative path to a data file, allowing developers to create connection strings that are based on a relative path to the data source instead of being required to specify a full path.

A localização física para a qual o DataDirectory aponta depende do tipo de aplicativo.The physical location that DataDirectory points to depends on the type of application. Nesse exemplo, o arquivo Northwind.mdf a ser anexado está localizado na pasta \app_data do aplicativo.In this example, the Northwind.mdf file to be attached is located in the application's \app_data folder.

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 mais alto na estrutura de diretórios que o diretório apontado pela cadeia de caracteres de substituição.When DataDirectory is used, the resulting file path cannot be higher in the directory structure than the directory pointed to by the substitution string. Por exemplo, se DataDirectory totalmente expandido for C:\AppDirectory\app_data, a cadeia de conexão de exemplo mostrada acima funcionará porque está abaixo de c:\AppDirectory.For example, if the fully expanded DataDirectory is C:\AppDirectory\app_data, then the sample connection string shown above works because it is below c:\AppDirectory. No entanto, a tentativa DataDirectory de |DataDirectory|\..\data especificar as resultará em um erro porque \data não é um subdiretório de \AppDirectory.However, attempting to specify DataDirectory as |DataDirectory|\..\data will result in an error because \data is not a subdirectory of \AppDirectory.

Se a cadeia de conexão tiver uma cadeia de caracteres de substituição formatada incorretamente, uma ArgumentException será gerada.If the connection string has an improperly formatted substitution string, an ArgumentException will be thrown.

Observação

System.Data.SqlClient resolve as cadeias de caracteres de substituição em caminhos completos no sistema de arquivos do computador local.System.Data.SqlClient resolves the substitution strings into full paths against the local computer file system. Portanto, os nomes do servidor remoto, de HTTP e do caminho UNC não têm suporte.Therefore, remote server, HTTP, and UNC path names are not supported. Uma exceção será gerada quando a conexão for aberta se o servidor não estiver localizado no computador local.An exception is thrown when the connection is opened if the server is not located on the local computer.

Quando SqlConnection estiver aberto, ele será redirecionado da instância padrão do SQL Server Express para uma instância iniciada em tempo de execução que é executada na conta do chamador.When the SqlConnection is opened, it is redirected from the default SQL Server Express instance to a run-time initiated instance running under the caller's account.

Observação

Pode ser necessário aumentar o valor de ConnectionTimeout porque as instâncias de usuários podem levar mais tempo para carregar que instâncias normais.It may be necessary to increase the ConnectionTimeout value since user instances may take longer to load than regular instances.

O fragmento de código a seguir abre uma nova SqlConnection, exibe a cadeia de conexão na janela do console e, em seguida, fecha a conexão ao sair do bloco de código using.The following code fragment opens a new SqlConnection, displays the connection string in the console window, and then closes the connection when exiting the using code block.

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

As instâncias de usuário não têm suporte no código CLR (Common Language Runtime) que está sendo executado dentro do SQL Server.User instances are not supported in common language runtime (CLR) code that is running inside of SQL Server. Uma InvalidOperationException é gerada se Open é chamado em um SqlConnection que tem User Instance=true na cadeia de conexão.An InvalidOperationException is thrown if Open is called on a SqlConnection that has User Instance=true in the connection string.

Tempo de vida de uma conexão de instância de usuárioLifetime of a User Instance Connection

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.Unlike versions of SQL Server that run as a service, SQL Server Express instances do not need to be manually started and stopped. Cada vez que um usuário faz logon e se conecta a uma instância de usuário, a instância do usuário é iniciada se já não estiver em execução.Each time a user logs in and connects to a user instance, the user instance is started if it is not already running. Os bancos de dados de instância de usuário têm a opção AutoClose definida de modo que o banco de dados seja fechado automaticamente após um período de inatividade.User instance databases have the AutoClose option set so that the database is automatically shut down after a period of inactivity. O processo do sqlservr.exe que é iniciado permanece em execução por um período limitado depois que a última conexão à instância é fechada, para que ele não precisa ser reiniciado se outra conexão for aberta antes de o tempo limite expirar.The sqlservr.exe process that is started is kept running for a limited time-out period after the last connection to the instance is closed, so it does not need to be restarted if another connection is opened before the time-out has expired. A instância do usuário será encerrada automaticamente se nenhuma nova conexão for aberta antes de o período de tempo limite expirar.The user instance automatically shuts down if no new connection opens before that time-out period has expired. 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 de tempo limite da instância do usuário .A system administrator on the parent instance can set the duration of the time-out period for a user instance by using sp_configure to change the user instance timeout option. O padrão é 60 minutos.The default is 60 minutes.

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á fechada automaticamente.If Min Pool Size is used in the connection string with a value greater than zero, the connection pooler will always maintain a few opened connections, and the user instance will not automatically shut down.

Como as instâncias de usuário funcionamHow User Instances Work

Na primeira vez em que uma instância de usuário é gerada para cada usuário, os bancos de dados do sistema mestre e msdb são copiados da pasta Data template 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.The first time a user instance is generated for each user, the master and msdb system databases are copied from the Template Data folder to a path under the user's local application data repository directory for exclusive use by the user instance. Esse caminho é normalmente C:\Documents and Settings\<UserName>\Local Settings\Application Data\Microsoft\Microsoft SQL Server Data\SQLEXPRESS.This path is typically 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, de log e de rastreamento também são gravados nesse diretório.When a user instance starts up, the tempdb, log, and trace files are also written to this directory. Um nome é gerado para a instância, que deve ser exclusiva para cada usuário.A name is generated for the instance, which is guaranteed to be unique for each user.

Por padrão, todos os membros do grupo Builtin\Users do Windows têm permissões para se conectarem à instância local bem como ler e executar permissões nos binários do SQL Server.By default all members of the Windows Builtin\Users group are granted permissions to connect on the local instance as well as read and execute permissions on the SQL Server binaries. Depois de as credenciais do usuário de chamada que hospeda a instância de usuário tiverem sido verificadas, o usuário torna-se sysadmin nessa instância.Once the credentials of the calling user hosting the user instance have been verified, that user becomes the sysadmin on that instance. Somente a memória compartilhada é habilitada para instâncias de usuário, o que significa que somente operações no computador local são possíveis.Only shared memory is enabled for user instances, which means that only operations on the local machine are possible.

Os usuários devem ter permissões de leitura e gravação nos arquivos .mdf e .ldf especificados na cadeia de conexão.Users must be granted both read and write permissions on the .mdf and .ldf files specified in the connection string.

Observação

Os arquivos .mdf e .ldf representam o banco de dados e os arquivos de log, respectivamente.The .mdf and .ldf files represent the database and log files, respectively. Esses dois arquivos são um conjunto correspondente, portanto tome cuidado durante operações de backup e restauração.These two files are a matched set, so care must be taken during backup and restore operations. 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 agrupado com o arquivo de log incorreto.The database file contains information about the exact version of the log file, and the database will not open if it is coupled with the wrong log file.

Para evitar a corrupção de dados, um banco de dados na instância do usuário é aberto com acesso exclusivo.To avoid data corruption, a database in the user instance is opened with exclusive access. 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 de ser aberto em uma segunda instância.If two different user instances share the same database on the same computer, the user on the first instance must close the database before it can be opened in a second instance.

Cenários de instância de usuárioUser Instance Scenarios

As instâncias de usuários 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 em seus computadores de desenvolvimento.User instances provide developers of database applications with a SQL Server data store that does not depend on developers having administrative accounts on their development computers. 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 completas em todos os objetos de banco de dados sem precisar da intervenção de um administrador do sistema para conceder permissões.User instances are based on the Access/Jet model, where the database application simply connects to a file, and the user automatically has full permissions on all of the database objects without needing the intervention of a system administrator to grant permissions. Ele destina-se a funcionar em situações onde o usuário está executando em uma conta de usuário de privilégios mínimos (LUA) e não tem privilégios administrativos no servidor ou no computador local, mas precisa criar objetos de banco de dados e aplicativos.It is intended to work in situations where the user is running under a least-privilege user account (LUA) and does not have administrative privileges on the server or local machine, yet needs to create database objects and applications. As instâncias de usuário permitem que os usuários criem as instâncias em tempo de execução que são executadas no próprio contexto de segurança do usuário, e não no contexto de segurança de um serviço do sistema mais privilegiado.User instances allow users to create instances at run time that run under the user's own security context, and not in the security context of a more privileged system service.

Importante

As instâncias de usuário devem ser utilizadas somente em situações onde todos os aplicativos que as usam são totalmente confiáveis.User instances should only be used in scenarios where all the applications using it are fully trusted.

Os cenários de instância de usuário incluem:User instance scenarios include:

  • Qualquer aplicativo de usuário único onde compartilhar dados não é necessário.Any single-user application where sharing data is not required.

  • Implantação do ClickOnce.ClickOnce deployment. Se o .NET Framework 2.0 (ou posterior) e o SQL Server Express já estiver instalado no computador de destino, o pacote de instalação baixado como resultado de uma ação de ClickOnce poderá ser instalado e usado por usuários não administrativos.If the .NET Framework 2.0 (or later) and SQL Server Express are already installed on the target computer, the installation package downloaded as a result of a ClickOnce action can be installed and used by non-administrator users. Observe que um administrador deve instalar o SQL Server Express se isso for parte da instalação.Note that an administrator must install SQL Server Express if that is part of the setup. Para obter mais informações, consulte implantação do ClickOnce para Windows Forms.For more information, see ClickOnce Deployment for Windows Forms.

  • ASP.NET dedicado hospedado usando a Autenticação do Windows.Dedicated ASP.NET hosting using Windows Authentication. Uma única instância do SQL Server Express pode ser hospedada em uma intranet.A single SQL Server Express instance can be hosted on an intranet. O aplicativo conecta-se usando a conta ASPNET do Windows, não usando representação.The application connects using the ASPNET Windows account, not by using impersonation. As instâncias de usuário não devem ser usadas para os cenários de hospedagem compartilhados ou de terceiros onde todos os aplicativos compartilhariam a mesma instância de usuário e não permanecessem isolados entre si.User instances should not be used for third-party or shared hosting scenarios where all applications would share the same user instance and would no longer remain isolated from each other.

Consulte tambémSee also