如何在 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 连接的不同,不要尝试将 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