如何在SQL Server Express 2008中创建新数据库并允许连接?

3
我在本地计算机上运行了一个 SQL Server Express 2008 R2 实例,并且采用了“混合”身份验证,所以我可以使用 Windows 登录和 SQL Server 身份验证登录。启用了命名管道和 TCP/IP,并允许远程连接。我按以下步骤创建了一个新的登录和数据库:
1. 使用 SQL Server Management Studio Express 登录并创建一个新登录。 2. 使用新创建的登录作为所有者创建了一个新数据库。
如最后一张截图所示,“dbo” 是属于“mylogin” 登录名的“用户名”。我试图使用以下连接字符串连接,但它不起作用:
Data Source=(local)\sqlexpress;Initial Catalog=newdb;User id=mylogin;Password=mypass
在 SQL Server Management studio express 的错误日志中显示:“Login failed for user 'mylogin'. Reason: Failed to open the explicitly specified database. [CLIENT: xxx.xxx.x.xx]. Error: 18456, Severity: 14, State: 38”。
如果将连接字符串中的 “User id” 更改为 “dbo”,则会报告以下错误:“Login failed for user 'dbo'. Reason: Could not find a login matching the name provided. [Client: xxx.xxx.x.xx]”。
我的 ASP.NET 应用程序尝试连接时才出现此问题。使用 SQL Server Management Studio Express 和上述凭据登录是可行的。

你尝试过从Visual Studio服务器资源管理器创建到新数据库的连接吗?如果这是SQL Server Express,最好将数据库放在App Data文件夹下并将其附加到SQL Server Express。 - Damith
所以问题是你有两个Express实例,一个是直接安装的,另一个是在Visual Studio中运行的吗?当你在Management Studio中连接时,SELECT @@SERVERNAME返回什么?如果它与你尝试从ASP.NET连接到的不同,那就太糟糕了。 - Aaron Bertrand
1个回答

5
  1. 不要尝试将dbo映射到你的登录名。dbo是一个特殊的用户。

  2. 使用SQL身份验证连接到SQL Server时,需要通过登录而不是用户进行连接(让我们暂时不讨论Denali中包含的数据库)。因此,在连接字符串中永远不应该尝试指定数据库用户(如dbo)。我强烈建议创建一个登录名,然后在数据库级别创建一个与登录名匹配的同名用户 - 这比尝试将login_foo映射到user_bar要简单得多。我还建议避免为用户或登录名使用特殊单词(例如dbo)。

  3. 我建议学习设置此类内容所需的DDL和存储过程,并停止通过UI进行点选操作。虽然UI对于某些任务可能更快,但很难精确地重现您所做的事情,并且需要大量的时间才能弄清楚您在对话框选项卡中设置了哪些选项。如果使用脚本,您可以发布脚本,我们可以看到所有内容而无需进一步提问,您还可以保存该脚本并参考它(这至少与您的记忆一样好,但几乎肯定更好)。

以下是我如何添加服务器登录名,将其作为用户放入newdb数据库中,将其添加到db_owner(而不是dbo)角色,并将其默认数据库设置为newdb。在Management Studio中打开一个新的查询窗口并连接到master,然后运行以下命令:

USE [master];
GO
CREATE LOGIN Ropstah_test WITH PASSWORD = 'secure password';
GO
USE newdb;
GO
CREATE USER Ropstah_test FROM LOGIN Ropstah_test;
GO
EXEC sp_addrolemember 'db_owner', 'Ropstah_test';
GO
USE [master];
GO
ALTER LOGIN Ropstah_test WITH DEFAULT_DATABASE = newdb;
GO

现在你的.NET连接字符串应该如下所示:

Data Source=.\SQLEXPRESS;Initial Catalog=newdb;User ID=Ropstah_test;Password=secure password;

如果这样做不起作用,我建议您验证一下ASP.NET应用程序是否在与SQL Express实例相同的计算机上运行。WEB服务器也在您的计算机上对吧?除此之外,这个方法是可行的。如果它不起作用,那么就可能有其他影响因素。你不需要让用户成为实际的数据库所有者来连接,但如果以上方法仍不能解决问题,请看看以下脚本是否能改变日志中记录的错误信息或至少改变行为:
USE newdb;
GO
DROP USER Ropstah_test;
GO
USE [master];
GO
ALTER AUTHORIZATION ON DATABASE::newdb TO Ropstah_test;

这将从数据库中删除用户,然后重新添加他们作为官方所有者(这与处于db_owner角色不同,后者基本上只是授予权限模板的简写)。这不应该是必需的,但它可能有助于隔离为什么您无法使这个通常简单的过程工作。


谢谢您详细的解释!我非常感激。 - Ropstah

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