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

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个回答

189

以管理员身份运行SQL Server Management Studio。(右键单击->以管理员身份运行)在我的情况下,这解决了所有奇怪的问题。

SQL SRV EXPRESS 2008 R2。 Windows 7


5
以管理员身份运行管理工具对我没有用。在尝试启动Windows服务时会出现此错误。 - marknuzz
10
以管理员身份运行是第一步。第二步是通过Windows身份验证登录到SQL Server。(这种方法对我起作用!) - Furkan Ekinci
3
对我也起作用了。无法用言语表达在Windows上权限提示和错误是多么令人疲劳和沮丧。我是管理员! - David Masters
3
我也试过了,对我有用。SQL Server 2019,SSMS 18.4。 - Ryan Thomas
1
我已经面临这个问题很多年了。这是我见过的最简单的方法,而且它对我很有效。谢谢! - workingbird
显示剩余5条评论

113

感谢所有的评论,你们中的一些人帮助我找到了答案。这就是我发现的:

问题出在NTFS权限上,而不是SQL问题。此外,它看起来有点像bug(而且它是可以重复的)。

问题如下: 我使用的账户通过组成员身份(本地管理员组拥有权限,我的账户是本地管理员组的成员),对mdf和ldf文件拥有完全控制的NTFS权限。(我验证了权限)

如果我尝试使用我的身份连接到SQL服务器(我在管理员组中),尝试附加该数据库时,会因为NTFS问题而失败。

但是,如果我将本地管理员组拥有的相同文件权限直接授予我的域账户,那么我就可以顺利附加该数据库。

(噢,是的,我检查了这台机器上的本地组,并验证了我的域账户确实是本地管理员组的成员)。

因此,似乎错误是因为某些代码(无论是在SQL Server还是Management Studio中)检查用户账户持有的权限,但它并不检查用户账户继承的组权限。

这对我来说听起来很奇怪,但我可以一遍又一遍地重现它,所以我得出了结论,这就是答案。

更新:我已经将此报告为错误:https://connect.microsoft.com/SQLServer/feedback/details/539703/access-denied-attaching-a-database-when-permissions-are-inherited


106
如果像我一样,你正在使用Windows 7操作系统,为了避免出现这个错误,你需要以管理员身份运行SQL Server Management Studio。 - Antony
4
在Win7 Pro上使用SS2008 Express复现,无论是sqlcmd还是SSMS都存在相同的问题。==消息“5120”,级别“16”,状态“101”,服务器“DAGO \ SQLEXPRESS”,行1 -“无法打开物理文件'D:\ data \ mssql \ drei.mdf'。操作系统错误5:“5(拒绝访问)”==授予用户完全访问权限(该用户是本地管理员组的成员,具有访问权限)可以解决该问题。此外,以管理员身份运行sqlcmd(或者我猜是SSMS)不会产生此错误。 - Lumi
1
Anthony Highsky有答案。只需要确保以管理员身份运行管理工作室即可。 - James
4
以管理员身份运行管理工作室对我没有用。 在尝试启动Windows服务时会出现此错误。 - marknuzz
1
@RobertCalhoun 进行检查是有道理的,但仍然似乎存在错误,因为我的帐户确实拥有文件的权限。我通过一个AD组拥有权限。如果我直接授予相同的权限给我的用户帐户而不依赖于组成员身份,则可以正常工作。这就是看起来有问题的部分。就像他们读取了帐户权限,但没有读取帐户组权限一样。 - JMarsch
显示剩余8条评论

22

我想为已经发布的答案添加额外的信息。

当分离数据库时要小心,因为您登录的Windows用户成为唯一具有对.mdf文件权限的用户!.mdf文件原有的权限包括用户SQLServerMSSQLUser$<computer_name>$<instance_name>和管理员帐户将被任何您登录的Windows用户(而不是SQL Server用户)覆盖。所有权限都会立即消失。所以像其他人建议的那样,右键单击您的.mdf文件并检查权限。

我遇到了这个问题,因为我使用SSMS连接到数据库(无论使用哪个SQL Server帐户),然后分离了数据库。在这样做之后,我的Windows用户是唯一一个具有访问.mdf文件权限的用户。所以,稍后当我尝试使用sa账户附加数据库时,它抛出了“拒绝访问”错误。

为保留原有的权限,您应该按以下顺序进行:将数据库脱机,然后分离,最后再附加。

USE [master]
GO
-- kick all users out of the db
ALTER DATABASE mydb
SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO

-- Take the Database Offline
ALTER DATABASE mydb SET OFFLINE WITH
ROLLBACK IMMEDIATE
GO

-- detach the db
EXEC master.dbo.sp_detach_db @dbname = N'mydb'
GO

1
谢谢!我认为如果您还使用具有serveradmin权限的SQL Server身份验证帐户登录,那么正确性会大大提高。 - William Rose
不幸的是,如果我最初将数据库创建为“sa”而不是Windows用户,则这对我没有帮助。 - David Gardiner
在分离数据库时要小心。请告诉SSMS要小心操作。我的问题是因为使用SSMS的复制数据库命令失败了,没有任何解释,让我陷入了困境。 - Alan Macdonald

21

给存放 .mdf 文件的文件夹添加权限。

检查这个名称:NT Service\MSSQLSERVER

并将位置(Location) 更改为您的服务器名称。


7
为了找到精确的帐户名称,因为它可能因实例而异,请运行以下命令:SELECT servicename, service_account FROM sys.dm_server_services - Arve Systad

14

以管理员身份运行SQL Server Management Studio。(右键->以管理员身份运行)对于我来说,在Windows 7 - SQL Server 2008 R2上有效。


1
这个回答应该得到点赞。以管理员身份运行SSMS是复制此答案的一种解决方法。Microsoft在这里报告了这种“预期行为”:[链接](https://connect.microsoft.com/SQLServer/feedback/details/539703/access-denied-attaching-a-database-when-permissions-are-inherited) - FreeText
这不是和MandoMando的答案一样吗? - mortb

13

这个问题是由UAC(用户帐户控制)引起的,不是吗?尽管您的用户帐户是管理员组的成员,但Windows 7中的UAC不允许您执行管理员任务,除非您以“管理员身份运行”程序。它不是SQL Server或Management Studio等软件中的真正错误。 (虽然它可能知道问题并要求您获得提升的权限,而不仅仅是抱怨“错误5”。)


10

在Windows 7中,可以通过以下方式附加SQL2005数据库:

start menu >
 all program >
  Microsoft sql server 2005 >
   sql server management studio >
    right click >
     run as administrator >
      click ok

然后成功附加了数据库。


这在 Windows 10 上使用 SQL Server 2016 和 Management Studio 2008 R2 工作 :) - par

9

当你使用 sa(或任何Sql Server帐户)登录时,你实际上是作为SQL Server服务帐户运行的,而当你以自己的身份登录时,你拥有自己账户的权限。由于某些原因,你没有适当的文件访问权限,但服务帐户有。


NTFS问题是我首先想到的,但似乎不是问题:我是本地管理员组的成员,并且我验证了管理员对mdf和ldf文件具有“完全控制”权限。此外,我是文件的所有者--我刚刚创建了一个目录并将mdf / ldf文件复制到它们的位置。 - JMarsch
@JMarsch: @Nick的意思是,'sa'拥有一组SQLSERVER权限--而不是NTFS权限--而你的帐户没有这些权限。 - Trevoke
@Trevoke:我同意你的观点。如果是这样,那么我需要为我的用户账户分配哪些权限呢?(我已经被分配到了sysadmin角色) - JMarsch
2
虽然这是旧答案,但对于像我五分钟前一样的人来说:您可以通过运行“SELECT servicename,service_account FROM sys.dm_server_services”来找到确切的服务用户名称。 - Arve Systad

7
我发现了这个解决方案:右键点击存储.mdf文件的文件夹-> 点击属性-> 选择安全选项卡,点击编辑...并赋予它完全控制权限。 希望这可以帮到你!

6

这个问题可以很容易地解决,只需进入存储 mdf 文件 的文件夹。选择文件 -> 右键单击 -> 点击属性,并为登录用户安全性授予文件的完全权限


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