连接数据库时出现“访问被拒绝”的错误提示

159

我正在使用SQL Server 2008开发版。我尝试附加AdventureWorks2008数据库。

当我尝试附加时,出现了“拒绝访问”的错误。根据事件日志,这是来自操作系统的:

打开失败:无法为文件号0打开文件D:\ProjectData\AdventureWorks\AdventureWorksLT2008_Data.mdf。操作系统错误:5(拒绝访问)。

我认为这是“NTFS问题”,但是我的系统和我都具有两个文件的修改权限。

我发现,如果我以sa身份登录,则可以成功附加数据库,但我的用户帐户不起作用。

我是机器上本地管理员组的成员,并且在SQL Server实例中处于sysadmin角色。

为什么我必须以sa身份登录才能成功附加数据库?


MDF文件是否加密了? - Brettski
不,对我来说真正好奇的是,如果我使用 sa(使用管理工具)登录,则可以正常工作,但如果我使用本地管理员帐户,则无法正常工作。我的帐户是管理员,域管理员,并且在安装 SQL Server 时我使用的就是这个帐户(在设置期间有一个选项可以将我的当前帐户设置为 sysadmin,我也这样做了)。 - JMarsch
1
这就是W7中UAC的工作方式,毫不意外。 - Al Kepp
@AlKepp 不是UAC的问题。只需使用sa登录(SQL服务器帐户,与UAC无关)即可解决问题。此外,仅通过成为本地管理员组的成员,我就可以获得我的权限 - 我不必提升权限才能使我的AD凭据工作。 - JMarsch
31个回答

5

sa用户使用NTFS账户SQLServerMSSQLUser$<计算机名称>$<实例名称>SQLServerSQLAgentUser$<计算机名称>$<实例名称>访问数据库文件。您可能想尝试为这两个用户中的一个或两个添加权限。

我不知道是否解决了您的问题,因为您说sa用户没有问题,但我希望它能有所帮助。


5

我正在使用Windows 8操作系统,想要在SQL Server Manager Studio中附加数据库。可以通过右键点击SQL Server Manager Studio并选择“以管理员身份运行”来完成附加操作,这样即可顺利完成附加。


3
每次遇到这个问题都是在试图附加一个位于与SQL服务器设置的默认数据库目录不同的目录中的数据库时出现的。
我强烈建议您不要在各种目录和帐户上进行权限调整,而是将数据文件移到SQL服务器期望找到它的目录中。

在很多情况下,我同意你的观点,但是对于SQL Server来说,你经常希望能够将数据库定位在不同的主轴或卷上以实现可扩展性。事实上,将事务日志放置在与数据库不同的主轴上以提高事务吞吐量是一种常见做法。 - JMarsch
@JMarsch:是的,目录实际上可以通过服务器属性>数据库设置选项卡进行配置,以设置默认数据和日志位置... - NotMe
这涉及到默认值,但那只是默认值。如果您的服务器管理多个活跃使用的数据库,则将dbs放在其他地方完全可以接受,而且甚至并不罕见。 - JMarsch
我即使使用默认的 SQL Server 目录 c:\Program Files\Microsoft SQL Server\MSSQL10_50.SPATIAL_IM\MSSQL\DATA\mydb.mdf 在 win7 上仍然遇到了相同的问题。 - goku_da_master

3

我只是想补充这个信息。

http://www.mssqltips.com/sqlservertip/2528/database-attach-failure-in-sql-server-2008-r2/

解决方案

出现此错误的原因是两个不同的登录用户进行了分离和附加操作。因此,在分离时,文件的所有者是第一个登录用户,但是由于使用的登录用户不是mdf和ldf文件的所有者,所以附加失败。

当我们分离数据库文件时,所有者变为执行分离命令的人,因此为了解决此问题,我们需要将其他登录用户添加或更改为mdf和ldf文件的所有者。

右键单击“filename.mdf”文件并选择属性以检查mdf文件的权限。在这里,我们可以看到只有一个帐户对“filename.mdf”文件具有权限,因为该帐户用于分离数据库。

要解决此问题,请单击“添加...”按钮以添加其他登录用户或任何其他所需的登录用户,并授予该登录用户完全控制权限。您还应该为“ldf”文件执行此操作。完成此任务后,单击“确定”按钮。(请注意,对于其他操作系统版本,您可能会看到“编辑”选项,先单击此选项,然后再看到“添加...”选项。)


我在 SSMS 中更改了我的连接以匹配执行分离操作的用户,然后我成功执行了附加操作。 - glitzsfa

2

如果有人遇到我所遇到的这个特定问题,以下内容可能会对你有所帮助:

  • SQL Express 2008
  • Visual Studio 2010 Premium

通过上下文菜单,我创建了一个用于调试目的的 SQL Express 数据库。连接字符串(由 NHibernate 使用)如下:

Server=.\SQLExpress;
AttachDbFilename=|DataDirectory|DebugDatabase.mdf;
Database=DebugDatabase;
Trusted_Connection=Yes;

这使我在数据库文件上遇到了同样的“拒绝访问”错误。我尝试给各种用户对文件夹和文件授予完全控制权限,甚至是“每个人”。没有任何帮助,所以我又删除了添加的权限。
最终解决问题的方法是在Visual Studio中打开Server Explorer,然后连接到MDF,再将其分离。完成这些步骤后,我的Web应用程序就可以正常访问数据库了。
PS. 感谢我在Google搜索这个特定问题时发现的这篇博客文章,它触发了通过附加/分离数据库来解决问题的想法。

2

我将一个数据库mdf从默认的Data文件夹移动到我的asp.net app_data文件夹,并在尝试将数据库设置为在线时遇到了这个问题。

我比较了原始位置中其他文件数据库的安全设置与移动后的文件,发现MSSQL$SQLEXPRESS没有被分配权限到它们的新位置。我添加了“NT SERVICE\MSSQL$SQLEXPRESS”的完全控制权限(必须包括该NT SERVICE),然后它就可以正常附加了。

原始的Data文件夹似乎有这些权限,而文件会继承它。当移动文件时,继承关系当然就断开了。

我检查了另一个项目的mdf文件,我直接创建到它的app_data文件夹中。它没有MSSQL$SQLEXPRESS权限。嗯,我想知道为什么SQL Express喜欢其中一个,但不喜欢另一个?


当我将日志文件移动到单独的磁盘上时,这个解决方案在Windows 10和SQL Server 2017上对我有效。在我的情况下,用户名是“NT SERVICE\MSSQLSERVER”。 - John Hanley

2

我作为sa出现了这个错误。 在我的情况下,数据库安全性并不重要。 我将mdf和ldf文件的权限设置为每个人都拥有完全控制权, 然后附加操作就成功了。


1

enter image description here

USE [master]
GO
CREATE DATABASE [DataBasename] ON 
( FILENAME = N'C:\data\DataBasename.mdf' )
 FOR ATTACH
GO

改为 FOR ATTACH -- > FOR ATTACH_FORCE_REBUILD_LOG

USE [master]
GO
CREATE DATABASE [DataBasename] ON 
( FILENAME = N'C:\data\DataBasename.mdf' )
 FOR ATTACH_FORCE_REBUILD_LOG
GO

1

我在VS 2019中遇到了相同的问题。如果还有人遇到同样的问题,请确保您已经/正在执行以下操作:

  1. 您的计算机上应安装SQL Express
  2. 在VS中应安装SSDT(在VS 2019中-安装时请确保检查此组件;对于早期版本,您需要外部添加此组件)
  3. 将“User Instance = True”添加到连接字符串中
  4. 我认为这是可选项-以管理员模式打开VS和SQL Express,并作为管理员登录到SQL Express

1

将数据库复制到另一个文件夹并使用"Windows身份验证"附加或登录SQLServer

enter image description here


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