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

Posted

技术标签:

【中文标题】如何在 SQL Server Express 2008 中创建新数据库并允许连接?【英文标题】:How to create new database in SQL Server Express 2008 and allow for connecting? 【发布时间】:2011-08-20 15:15:16 【问题描述】:

我有一个 SQL Server Express 2008 R2 实例在我的本地电脑上运行。

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

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

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

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

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

SQL Server Management studio express 中的错误日志指出:

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

如果我将连接字符串中的User id更改为“dbo”,则会报以下错误:

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

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

仅当我尝试从我的 ASP.NET 应用程序连接时才会出现此问题。使用 SQL Server Management studio Express 进行连接,使用提到的凭据确实有效!

【问题讨论】:

您是否尝试从 Visual Studio Server Explorer 创建到新数据库的连接?如果这是 sql server express 更好,则将数据库放在 app data 文件夹下并将其附加到 sql server express 那么问题是您有两个 express 实例,一个是您直接安装的,一个是在 Visual Studio 中运行的?当您在 Management Studio 中连接时,SELECT @@SERVERNAME 会产生什么?如果它与您尝试从 ASP.NET 连接的不同, 【参考方案1】:

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

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

    我建议学习设置这些东西所需的 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 实例在同一台计算机上运行。网络服务器也在你的机器上,对吧?除此之外,这应该有效,如果它不起作用,则涉及其他一些不明显的变量。您不必让用户成为实际的数据库所有者来连接,但如果上述方法仍然不能解决问题,请查看以下脚本是否更改了行为或至少是日志中记录的错误消息:

USE newdb;
GO
DROP USER Ropstah_test;
GO
USE [master];
GO
ALTER AUTHORIZATION ON DATABASE::newdb TO Ropstah_test;

这会将用户从数据库中删除,然后将其重新添加为正式所有者(这与 db_owner 角色不同,后者本质上只是授予权限模板的简写)。这应该不是必需的,但它可能有助于找出为什么您无法让这个通常简单的过程起作用。

【讨论】:

感谢您的详尽解释!我真的很感激。

以上是关于如何在 SQL Server Express 2008 中创建新数据库并允许连接?的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 2005 express 中使用连接

如何将远程 SQL Server Express 数据库的部分副本复制到本地 SQL Server Express 数据库?

如何连接到 SQL Server 2008 Express 的本地实例

如何从 SQL Server DB 创建 SQL Server Express DB

如何在SQL Server 2008 Express中更改sa密码?

如何从 C# 代码将 SQL Server CE 迁移到 SQL Server 2012 Express