如何通过IIS启动SQL Server LocalDB

7

我正在为一个网站使用SQL Server LocalDB。

安装SQL Server LocalDB并在安装期间创建了数据库。通过LocalDBCreateInstanceStartLocalDBInstanceLocalDBShareInstance创建了一个共享实例。

如果启动了实例,网站可以成功连接到数据库。

但是,如果停止了实例,它不会自动启动。从控制台应用程序访问数据库(当实例停止时)会导致实例启动。

所以这似乎是某种权限问题。

应用程序池运行在AppPool标识下。将其切换为Network Service或Local System并不能解决问题。

应用程序池被配置为加载其用户配置文件,并且"setProfileEnvironment"属性也设置为true。(如此处此处所述,这两个设置都是必需的)。

我用Sysinternal Process Monitor监视了数据库访问,但未能找到任何"Access Denied"条目。

我还尝试从网站本身(在Global.asax中)调用StartLocalDBInstance。调用成功返回(返回值为S_OK),但实例仍然停止。

1个回答

8
使用IIS下LocalDB的缺点是,实例归您的交互式登录所有,实例进程只能由此登录启动。由于IIS以某些服务帐户运行,因此无法启动属于您的交互式登录帐户的LocalDB实例。您可以使用由IIS服务帐户拥有的LocalDB实例,但请注意可能会遇到用户配置文件问题,因为LocalDB需要创建和加载用户配置文件,而IIS使用轻量级用户配置文件,有时可能无法完全创建和加载。
请参考这两篇博客文章,以获取有关在完整的IIS中运行LocalDB的更详细讨论。我仅建议在开发环境中使用它,并在生产中使用基于服务的SQL Express。
  1. 第1部分:用户配置文件
  2. 第2部分:实例所有权

我在 CodePlex 上开发了一个小工具,旨在简化共享和启动自动实例(名为“v11.0”)与默认应用程序池的过程。虽然它需要扩展以支持自定义实例名称和其他应用程序池,但仅建议在开发环境中使用 :-) - Krzysztof Kozielczyk
奇怪。如果你可以将IIS中的“Load User Profile”设置为true,那么它应该能够工作。此外,我认为Express已经基本淘汰了,取而代之的是LocalDB... - dudeNumber4
我认为这种行为(不允许其他用户身份唤醒localDB实例)是一个不幸的设计疏忽。我不认为这里存在任何安全问题。如果拥有者不希望其他用户身份连接到他们的服务器,那么他们可以简单地删除该实例。我希望这个问题在未来的版本中得到解决,因为目前使用localDB进行开发意味着要求启动脚本和其他技巧,这对于单个用户来说是可以接受的,但在组织内部会带来问题。 - Zephyr was a Friend of Mine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接