非管理员用户实例

用户实例是一项功能,可以使非管理员用户使用自己的帐户运行 SQL Server 的本地版本。有了用户实例,非管理员用户便可对使用自己的帐户运行的实例具有数据库所有者特权。 

重要说明重要提示

后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。

用户实例也称为子实例或客户端实例,是父实例(作为服务运行的主实例,如 sqlExpress)代表用户生成的 SQL Server 实例。用户实例作为用户进程在该用户的安全上下文中运行。用户实例和父实例以及计算机上运行的任何其他用户实例相互独立。用户实例功能也称为“作为正常用户运行”(RANU)。

注意注意

为了保持一致,SQL Server Express 联机丛书将此功能称为用户实例。此外,此功能是随 SQL Server 2005 Express Edition 引入的。

为何使用用户实例?

下面列出了一些概述使用用户实例模型的优点的原因:

  • 用户实例模型的主要目的是使 SQL Server 的非管理员用户之间相互独立,从而允许用户附加任意数据库而不会带来危及其他用户的风险。通过为每个用户生成单独的 SQL Server 实例来实现这种独立性。

  • 除了保持独立性以外,SQL Server Express 的目的还包括便于非管理员用户使用。许多 Windows 用户都有拥有具有管理特权的帐户。但是,以 Administrator 的身份运行容易使恶意软件侵占用户计算机。但是,非管理员用户运行的恶意软件不能进行系统范围内的更改,因此只能造成有限的破坏。

用户实例概述

用户实例模型可总结为下列几点:

  • 必须运行 SQL Server 父实例才能生成用户实例。

  • 每当安装 SQL Server Express 时,安装程序都会创建 Template Data 文件夹,用来存储用户实例进程(如果调用)将使用的无错的系统数据库。

  • 若要调用用户实例,请使用 SQLClient 中的 user instance 连接字符串关键字(可以为 true,也可以为 false),并默认为 false。当设置为 false 时,任何用户实例支持都无效,并且保留原始行为。如果 user instance 设置为 true,则会在 ADO .NET connection.open 调用过程中激活用户实例模型。

    注意注意

    System.Data.SqlClient 命名空间定义了一组类,这些类可以访问 SQL Server 数据库,并统称为 SQL Server 或 SqlClient .NET 数据提供程序。托管应用程序通过 ADO .NET API 与 SqlClient 进行交互,以便对 SQL Server 数据库中存储的数据和架构信息进行查询和操作。有关详细信息,请参阅 Visual Studio 2005 文档。

  • 当首次为任意用户生成用户实例时,系统数据库会从 Template Data 文件夹复制到用户的本地应用程序数据存储库目录下的路径,以供用户实例独占使用。该路径通常为 drive:\Documents and Settings\Username\Local Settings\Application Data\Microsoft\Microsoft SQL Server Data\SQLEXPRESS。

  • 用户作为 SysAdmin 连接到这个新的用户实例并使用数据库,即使该用户不是父实例中的管理员。

    安全说明安全说明

    在安装过程中作为 sysadmin 固定服务器角色成员设置的登录名在模板数据库中设置为管理员。只要未删除,这些登录名就是用户实例上 sysadmin 固定服务器角色的成员。

  • 当生成用户实例时, SQLClient 将所有调用都重定向到该用户实例。

注意注意

用户数据库根据文件系统特性以及数据库主文件的权限来派生其 READONLY 属性。不应用 ALTER DATABASE SET READ_ONLY/READ_WRITE 设置。

使用用户实例所需的连接字符串

conn string =
"Data Source=.\\SQLExpress" +
"integrated security=true;" + 
"attachdbfilename=|DataDirectory|\mydb.mdf;" +
"user instance=true"
string connstr = GetConnectionString(); // get from config
using(SqlConnection conn = new SqlConnection(connstr)) {
  // this will connect to the user instance, not to the 
  // default SSE instance
  conn.Open();
  // use the connection to the user instance
}

连接到用户实例

仅通过本地命名管道为用户实例提供网路协议支持,这意味着用户不能从远程计算机连接到用户实例。

有关通过使用 SQL Server Management Studio 连接到用户实例的信息,请参阅 SQL Server Express 联机丛书中的“SQL Server Management Studio 和 SQL Server Express”。

注意注意

有关命名管道或网络协议的详细信息,请参阅 SQL Server 配置管理器帮助。若要访问此帮助,请在“开始”菜单上,单击“运行”,再键入 SQLServerManager.msc。这样便可打开“SQL Server 配置管理器”。若要访问帮助,请单击“帮助”菜单。若要查看 SQL Server 的网络协议,请单击“SQL Server 网络配置”

管理用户实例

如果您是管理员并要管理用户实例,则以下信息将非常有用。

视图/存储过程/Transact-SQL

说明

Select * from sys.dm_os_child_instances

允许执行列出父实例中生成的所有用户实例的虚拟视图。

SHUTDOWN

停止 SQL Server。使用该命令可以停止用户实例。有关如何使用 SHUTDOWN 的详细信息,请参阅 SQL Server 联机丛书中的 SHUTDOWN (Transact-SQL)

sp_configure 'user instances enabled'

控制启用或禁用用户实例的功能。

若要启用用户实例的生成,请使用:

sp_configure 'user instances enabled','1' 

RECONFIGURE;

GO

若要禁用用户实例的生成,请使用:

sp_configure 'user instances enabled','0'.

sp_configure ‘user instance timeout’

用途:

sp_configure 'show advanced options', 1;

RECONFIGURE;

GO

sp_configure 'user instance timeout', 5;

GO

其中 5 为最小值,65535 为最大值。

您需要 sp_configure ‘show advanced options’ 才能查看和设置超时值。有关显示高级选项的详细信息,请参阅 SQL Server 联机丛书中的设置服务器配置选项

您可以在父实例和用户实例中设置用户实例超时值。

当用户实例启动时,它始终从父实例中获取超时值。但是,一旦用户实例启动,它便可使用 sp_configure 来更改仅对于该特定实例有效的超时值。

使用用户实例时的限制

当使用用户实例时,某些 SQL Server Express 功能可能不会如预期的那样发挥作用。以下列表说明可能出现的限制:

  • 一个用户只能有一个用户实例。

  • 复制将被禁用。

  • 用户实例不支持 SQL Server 身份验证。仅支持 Windows 身份验证。

  • 支持用于用户实例的网络协议仅为本地 Named Pipes。

  • 用户实例共享父实例的注册表项。

  • 不支持用户实例使用本机代码。只有 ADO .NET 支持该功能。

  • SQL Server Express 用户实例不支持全文搜索。

  • 动态生成的用户实例中不支持 WMI Provider for Server Events。该功能仍在父 SQL Server Express 实例中发挥作用。有关 WMI 提供程序的详细信息,请参阅 SQL Server 联机丛书中的 WMI Provider for Server Events