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

Rop*_*tah 3 asp.net connection-string database-connection sql-server-express

我有一个在我的本地PC上运行的SQL Server Express 2008 R2实例.

  • 身份验证是"混合"的,因此我可以使用Windows登录使用SQL Server身份验证登录.
  • 命名管道已启用
  • TCP/IP已启用
  • 允许远程连接

我采取了以下步骤来创建一个新的登录和数据库:

  1. 我使用SQL Server Management Studio Express登录并创建了新的登录名
  2. 我使用新创建的登录名作为所有者创建了一个新数据库

新登录

登录详细信息

新数据库

数据库安全

数据库所有者概述

正如您在上一个屏幕截图中看到的那样,有一个用户名 "dbo",它"属于" 登录名 "mylogin".我正在尝试使用以下连接字符串,但它不起作用:

数据源=(本地)\ sqlexpress;初始目录= newdb;用户ID = mylogin;密码= mypass

SQL Server Management Studio中的错误日志表明:

用户'mylogin'登录失败.原因:无法打开显式指定的数据库.[客户:xxx.xxx.x.xx].错误:18456,严重性:14,状态:38

如果我将连接字符串中的用户ID更改为"dbo",则会报告以下错误:

用户'dbo'登录失败.原因:找不到与提供的名称相匹配的登录信息.[客户:xxx.xxx.x.xx].

我现在开始变得非常疯狂.我根本不知道如何访问任何数据库......我的SQL Server实例是否已损坏?

当我尝试从我的ASP.NET应用程序连接时,只会出现此问题.使用SQL Server Management Studio Express连接,使用提到的凭据DOES工作!

Aar*_*and 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
Run Code Online (Sandbox Code Playgroud)

现在,来自.NET的连接字符串应如下所示:

Data Source=.\SQLEXPRESS;Initial Catalog=newdb;User ID=Ropstah_test;Password=secure password;
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,我将验证您的ASP.NET应用程序是否在与SQL Express实例相同的计算机上运行.网络服务器也在你的机器上,对吗?除此之外,这应该有效,如果它不起作用,还有一些其他变量并不明显.您不必让用户成为实际的数据库所有者进行连接,但如果上述内容仍无法解决问题,请查看以下脚本是否更改了行为或至少更改了日志中记录的错误消息:

USE newdb;
GO
DROP USER Ropstah_test;
GO
USE [master];
GO
ALTER AUTHORIZATION ON DATABASE::newdb TO Ropstah_test;
Run Code Online (Sandbox Code Playgroud)

这会将用户从数据库中删除,然后将其重新添加为官方所有者(这与db_owner角色不同,这实际上只是授予权限模板的简写).这不应该是必要的,但它可能有助于理清为什么你不能让这个通常很简单的过程工作.