【问题标题】:SQL Server 2012 classic asp connection stringSQL Server 2012 经典asp连接字符串
【发布时间】:2012-06-10 21:25:17
【问题描述】:

我有一个 SQL Server 2012 Express 安装,其中包含我创建的名为 BRD 的新数据库。我还在BRD 数据库中创建了一个测试表(tempDemo)和一个测试存储过程(getStList)。当我在查询窗口中运行存储过程时,它可以工作,所以我相信表和存储过程是合法的。 SQL Server 设置为“SQL Server 和 Windows 身份验证模式”。

然后我尝试创建一个经典 ASP 页面,然后使用以下连接字符串连接到 SQL Server:

objConn.ConnectionString="Provider=SQLOLEDB;Server=XPSI7\SQLEXPRESS;Database=BRD;Integrated Security=SSPI;"

此操作失败并显示以下消息:

“用于 SQL Server 的 Microsoft OLE DB 提供程序错误 '80004005' 无法打开登录请求的数据库“BRD”。登录失败。”

当我将数据库更改为MASTER 而不是BRD 时,ASP 页面不会出错。我只是通过打开它然后关闭它来测试连接字符串,但它似乎可以工作。

我在对象资源管理器中查看了MASTERBRD 的安全设置,但没有注意到其中的区别。我还查看了文件夹的 IIS_IUSRS,但也没有区别 - 不确定这是否有必要。

【问题讨论】:

  • 您尝试使用的用户 -- 它是否列在 BRD 数据库的“安全”选项卡下?显然这是一个有效的登录名,但似乎与 BRD 数据库没有关联...只要列表链接到一个有效的登录名,这就是数据库权限问题。
  • 感谢您以惊人的速度回复 OMG Ponies。这个问题很好,但是我对此有点困惑。 “用户”究竟是什么?在连接字符串中,我没有指定一个(我不认为)。为了尝试回答您的问题,我在每个用户下都有一个访客,但是 BRD 访客有一个红色的向下箭头。

标签: sql-server asp-classic connection-string


【解决方案1】:

SQL Server 在服务器级别验证您的登录。然后它会尝试打开您要求连接的数据库。此时,您需要将数据库级用户映射到服务器级登录,或者使用本身具有足够权限来使用数据库的服务器级登录。

使用 SQL Server 身份验证来演示这一点的简单(但不安全)方法:

USE master;
GO
CREATE LOGIN foo
  WITH PASSWORD = 'bar', CHECK_POLICY = OFF;
GO
USE BRD;
GO
CREATE USER foo FROM LOGIN foo;
GO
EXEC sp_addrolemember N'db_owner', N'foo';
GO

现在在您的 ASP 连接字符串中,使用:

objConn.ConnectionString = "Provider=SQLNCLI;Data Source=XPSI7\SQLEXPRESS;Initial Catalog=BRD;User ID=foo;Password=bar;"

您还可以将您正在使用的任何登录名映射到数据库用户,只需执行以下操作:

USE BRD;
GO
CREATE USER [YourDomain\IIS_IUSRwhatever] 
  FROM LOGIN [YourDomain\IIS_IUSRwhatever];
GO

这将授予他们访问数据库的权限,但由您决定授予哪些权限。这假设您允许匿名访问 Web 服务器;如果 IIS 具有挑战性并接受 Windows 身份验证,则您需要为将提交其凭据的用户执行上述操作。无论哪种情况,您都应该能够继续使用您现在拥有的连接字符串。

【讨论】:

  • 谢谢亚伦。您的回答简明扼要,易于理解和纠正。你提到这不是很安全。如果我想避免使用嵌入式 USER ID & PASSWORD 方法并在 connectionString 中使用 Integrated Security=SSPI,还需要做多少工作?
  • 不安全的部分是关于给应用程序用户 db_owner ... 通常你不会给 SQL auth 或 Windows auth 用户那么多。如果您只是使用 IIS 帐户,我真的没有理由在这里使用 Windows 身份验证。使用 SQL 身份验证帐户的好处是您可以轻松地以同一用户身份进行连接和调试。如果您实际上是通过网站进行身份验证并传递 Windows 凭据,您将使用 windows auth。这里的好处是更容易追踪谁在做什么。但是您需要设置个人登录名/用户或使用 Windows 组...
  • @AaronBertrand 您可以扩展您的答案,注意提供程序 SQLNCLI 对应于“SQL Server 2005 Native Client”、SQLNCLI10 到 2008 驱动程序和 SQLNCLI11 到 SQL Server 2012 之间的差异
  • 如果此答案对您没有帮助,您可能需要重新启动。我无法连接,我通常设置一个 SQL Server 帐户供应用程序使用,正如这个答案所暗示的那样。我将一个旧数据库恢复到这个新安装的 SQL 2012 安装中,而 .NET 正在运行时,Classic ASP 却不能。我有超时。在周五关闭并在今天启动后,它就可以正常工作了。我想重新启动以某种方式有所帮助,但我无法解释。我没有做任何额外的工作来让它工作,网络应用程序工作得很好。
【解决方案2】:

试试下面的连接字符串:

strConnection = "Provider=SQLNCLI10;Server=server_name;Database=" & BD_REMOTE_INITIAL_CATALOG & ";Uid=" & BD_REMOTE_USER_ID & "; Pwd=*****;"

【讨论】:

    猜你喜欢
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多