只要您的应用程序池帐户具有 SQL Express 的权限,就可以了。
您需要考虑以下几点:
- 你在使用用户实例吗?和/或
- 您的应用程序池是否作为应用程序池标识在 IIS 7 上运行?
用户实例
我猜它正在尝试附加到用户实例(也请参见此处的 ADO.NET 参考)。如果您不确定,请查看您的连接字符串是否包含
User Instance=true;AttachDBFilename=|DataDirectory|\InstanceDB.mdf
有一篇很棒的 MSDN 文章关于在 asp.net 中使用 SQL 数据库,名为“Using SQL Server Express with ASP.NET”,重复整个内容太长了。虽然它一般谈论使用它,但这些原则也适用于部署,并涵盖用户实例。
如果是您使用用户实例的情况,那么您还需要检查是否安装了 SQL Server 以允许它们。您可以通过运行sp_configure
查看设置来执行此操作:
exec sp_configure 'user instances enabled'
如果它返回“1”,那么您启用了用户实例,如果没有,那么exec sp_configure 'user instances enabled', '1'
将启用它们(并用于'0'
禁用它们)。
用户实例并不总是最佳选择,因此在执行此操作之前,请检查您是否不想使用普通实例。
IIS 7 应用程序池标识
随着 IIS 7 开始引入应用程序池标识。有时您需要授予他们访问 sql server 的权限:
- 确保您的应用程序池已启动(这很关键)(浏览到网站上的主页)
- 打开 SQL Server Management Studio (SSMS)
- 转到安全性-> 服务器级别的登录
- 右键单击,单击创建新登录
- 在登录字段中,键入
IIS APPPOOL\MyAppPoolName
并创建用户(设置您需要的任何其他设置)
- 我这里没有使用搜索功能,但是只要应用程序池在运行,名称就会验证,如果你愿意,你可以。
- 转到您的数据库并将登录名添加为具有适当权限的数据库主体
- db_owner 对于生产系统来说有点激进,但在创建新表等时最容易上手,然后你可以将其拨入数据读取器、写入器等)
或者,您可以运行:
CREATE LOGIN [IIS APPPOOL\MyAppPoolName] FROM WINDOWS;
USE MyDatabase
GO
CREATE USER MyAppPoolUser FOR LOGIN [IIS APPPOOL\MyAppPoolName];
EXEC sp_addrolemember N'role_name', N'MyAppPoolUser' -- role name could be db_owner
应用程序池标识现在是最佳实践,应尽可能使用(在某些情况下这是不可行的,例如多服务器设置)。
其他错误 - 应用程序池标识和用户实例
如果您看到错误“由于读取注册表项失败,无法生成 SQL Server 的用户实例。连接将被关闭”,那么您的 IIS 应用程序池标识和用户实例也存在问题。要解决这个问题:
- 转到 IIS 管理器
- 转到应用程序池的高级设置
- 在流程模型下,单击“加载用户配置文件”
还有一篇关于这些和用户实例的 iis.net 文章,名为“Application Pool Identities and SQL Server Express”(Thomas Demi),它很有用。