附加数据库时拒绝访问

JMa*_*sch 142 sql-server security administration

我正在使用SQL Server 2008开发人员版.我试图附加AdventureWorks2008数据库.

当我试图附加时,我收到"访问被拒绝"错误.根据事件日志,它来自O/S:

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

我认为"NTFS问题",但系统(和我)修改了对这两个文件的访问权限.

我发现如果我以sa身份登录,我可以成功附加数据库,但我的用户帐户将无法正常工作.

我是我机器上本地管理员组的成员,我在SQL Server实例中担任sysadmins角色.

知道为什么我必须以sa身份登录吗?

Man*_*ndo 155

以管理员身份运行SQL Server Management Studio.(右键单击 - >以管理员身份运行)处理我案例中的所有奇怪现象.

SQL SRV EXPRESS 2008 R2.Windows 7的

  • 以管理员身份运行是第一步.第二步是通过Windows身份验证登录到SQL Server.(这种方法对我有用!) (9认同)
  • 以管理员身份运行Management Studio并不适合我.尝试启动Windows服务时会发生此错误. (4认同)
  • 也为我工作过.无法用语言表达对Windows上的权限提示和错误感到厌倦和沮丧.我是一名管理员! (3认同)
  • 也为我工作过。SQL Server 2019、SSMS 18.4 (3认同)

JMa*_*sch 101

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

这是一个NTFS权限问题,而不是SQL问题.此外,它看起来有点类似bug(并且它是可重复的).

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

如果我尝试连接,连接到SQL Server(我在管理员组中),它会因NTFS问题而失败.

但是,如果我授予本地管理员组直接访问我的域帐户的相同文件权限,那么我可以附加没有任何问题.

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

因此,看起来好像发生了错误,因为某些代码(在SQL Server或Management Studio中)检查用户帐户所拥有的权限,但它不会检查用户帐户继承的组权限.

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

更新:我报了这个bug: https://connect.microsoft.com/SQLServer/feedback/details/539703/access-denied-attaching-a-database-when-permissions-are-inherited

  • 如果像我一样使用Windows 7,则必须以管理员身份运行SQL Server Management Studio以避免出现此错误. (102认同)
  • 使用SS2008 Express在Win7 Pro上重现.sqlcmd和SSMS都存在同样的问题.== Meldung'5120',Ebene'16',状态'101',服务器'DAGO\SQLEXPRESS',Zeile 1 - 'Die physische Datei'D:\ data\mssql\drei.mdf'kannnichtgeöffnetwerden.Betriebssystemfehler 5:'5(Zugriff verweigert)==授予用户(具有访问权限的本地管理员组成员)的完全访问权限可以解决问题.此外,以管理员身份运行sqlcmd(或SSMS,我猜)不会产生此错误. (4认同)
  • 以管理员身份运行Management Studio并不适合我.尝试启动Windows服务时会发生此错误. (4认同)

gok*_*ter 18

我想在发布的答案中添加其他信息.

分离数据库时要小心,因为您登录的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
Run Code Online (Sandbox Code Playgroud)


小智 17

添加文件所在.mdf文件夹的权限.

检查这个名字: NT Service\MSSQLSERVER

并更改Location为您的服务器名称.

  • 要找到确切的帐户名,因为它可能因实例而异,请运行:`SELECT servicename,service_account FROM sys.dm_server_services`. (5认同)

Al *_*epp 13

这个问题是由UAC(用户帐户控制)引起的,不是吗?虽然您的用户帐户是Administrators组的成员,但除非您以"管理员"身份运行程序,否则Windows 7中的UAC不允许您执行管理员操作.它不是SQL Server或Management Studio中的真正错误.(虽然它可能知道问题,并要求你提升权限而不是抱怨"错误5".)


Rol*_*n C 11

以管理员身份运行SQL Server Management Studio.(右键单击 - >以管理员身份运行)适用于Windows 7 - SQL server 2008 R2


小智 10

可以在Windows 7中以这种方式附加SQL2005数据库:

start menu >
 all program >
  Microsoft sql server 2005 >
   sql server management studio >
    right click >
     run as administrator >
      click ok
Run Code Online (Sandbox Code Playgroud)

然后附加数据库成功完成.


Nic*_*ver 9

当您以sa(或任何Sql Server帐户)身份登录时,您将作为SQL Server服务帐户运行,当您以自己的身份登录时,您拥有帐户的权限.由于某种原因,您没有适当的文件访问权限,但服务帐户具有相应的文件访

  • 旧答案,这个,但对于像我这样的人五分钟前:你可以通过运行`SELECT servicename, service_account FROM sys.dm_server_services`找到确切的服务用户名 (2认同)

dje*_*dot 5

sa用户使用NTFS账户SQLServerMSSQLUser$<computer_name>$<instance_name>SQLServerSQLAgentUser$<computer_name>$<instance_name>访问的数据库文件。您可能想尝试为这些用户中的一个或两个添加权限。

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


Gre*_*olf 5

和我一起 - 在第8窗口运行 - 点击SQL Server Manager Studio - >使用admin运行. - >没有问题


Ema*_*a.H 5

它可以很容易修复,但是只是转到你已经存储了mdf文件的文件夹.选择文件 - >右键单击 - >单击属性,并为登录用户安全性的文件授予完全权限.


小智 5

我找到了这个解决方案:右键单击存储.mdf文件的文件夹->单击“属性”->选择“安全性”选项卡,单击“编辑...”,然后对其进行完全控制。希望这可以帮助!