附加数据库时访问被拒绝


146

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

尝试附加时,收到“访问被拒绝”错误。根据事件日志,它来自操作系统:

打开失败:无法打开文件编号0的文件D:\ ProjectData \ AdventureWorks \ AdventureWorksLT2008_Data.mdf。OS错误:5(访问被拒绝。)。

我以为是“ NTFS问题”,但是系统(和我)可以修改对这两个文件的访问权限。

我发现如果以sa身份登录,可以成功附加数据库,但是我的用户帐户无法使用。

我是计算机上的本地管理员组的成员,并且在SQL Server实例中担任sysadmins角色。

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


MDF文件是否被偶然加密?
Brettski

不,对我来说,真正的好奇是,如果我以sa身份登录(使用Management Studio)可以正常工作,但是如果我使用本地管理员帐户则无法正常工作。我的帐户是一个管理员,一个域管理员,这是我在安装SQL Server时登录的帐户(在安装过程中,可以将当前帐户设置为sysadmin,而我确实是这样做的)。
JMarsch

1
这就是UAC在W7中的工作方式,不足为奇。
Al Kepp 2012年

@AlKepp Nope-不是UAC的事情。只是按照sa的纠正登录(SQL Server帐户,与UAC无关)的问题。另外,仅通过成为本地admins组的成员,我就获得了我的权限-无需提升权限即可使用我的AD凭据。
JMarsch 2012年

Answers:


162

以管理员身份运行SQL Server Management Studio。(右键单击->以管理员身份运行)解决了我的所有怪异问题。

SQL SRV EXPRESS 2008 R2。Windows 7的


5
以管理员身份运行Management Studio不适用于我。尝试启动Windows服务时发生此错误。
nuzzolilo 2013年

9
第一步是以管理员身份运行。第二步是通过Windows身份验证登录到SQL Server。(此方法对我
有用

3
也为我工作。无法用语言表达Windows上的权限提示和错误如何令人厌烦和沮丧。我是管理员!
David Masters

也为我工作。起初,我认为它不起作用,因为SSMS只是一个UI客户端。我以为需要该服务以Admin身份运行。但是,以管理员身份运行SSMS就足够了。
路加福音18'Aug

2
也为我工作。SQL Server 2019,SSMS 18.4
Ryan Thomas

104

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

这是NTFS权限问题,而不是SQL问题。此外,它看起来有点像错误(并且是可重复的)。

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

如果我尝试执行附加操作,请以我的身份连接到SQL Server(我在admins组中),则失败,并出现NTFS问题。

但是,如果我将与本地管理员组直接相同的文件权限授予我的域帐户,则可以毫无问题地附加。

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

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

这对我来说听起来很奇怪,但是我可以一遍又一遍地复制它,因此我得出结论,这就是答案。

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


104
如果像我一样使用Windows 7,则必须以管理员身份运行SQL Server Management Studio,以避免出现此错误。
安东尼2010年

4
在Win7 Pro上使用SS2008 Express复制。sqlcmd和SSMS都存在相同的问题。== Meldung'5120',Ebene'16',状态'101',服务器'DAGO \ SQLEXPRESS',Zeile 1-'Die Physiche Datei'D:\ data \ mssql \ drei.mdf'kann nichtgeöffnetwerden。Betriebssystemfehler 5:'5(Zugriff verweigert)==向用户授予完全访问权限(该用户是具有访问权限的本地管理员组的成员)可以解决此问题。另外,以管理员身份运行sqlcmd(或SSMS,我猜)不会产生此错误。
Lumi

1
安东尼·海斯基(Anthony Highsky)给出了答案。只需确保以管理员身份运行Management Studio。
詹姆斯,

对我来说,同样的问题和解决方案。2008R2,Win 7等。只是将我自己明确添加到安全列表中,并且它起作用了。我想SQL Server可以在附加后读取它们,但是附加时不能在我的凭据下读取?
Andrew Backer

4
以管理员身份运行Management Studio不适用于我。尝试启动Windows服务时发生此错误。
nuzzolilo 2013年

20

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

分离数据库时要小心,因为您以Windows用户身份登录的Windows用户将成为唯一拥有.mdf文件权限的用户!.mdf文件所具有的原始权限(包括该用户SQLServerMSSQLUser$<computer_name>$<instance_name>和Administrators帐户)将由您以其登录的Windows用户(而非sql server用户)覆盖。繁荣,所有权限就这样消失了。就像其他人所说的那样,然后右键单击.mdf文件,然后仔细检查权限。

我遇到了这个问题,因为我使用SSMS连接到数据库(与哪个sql服务器帐户无关)并分离了数据库。完成此操作后,我的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 Authenticated帐户登录,则更容易实现此目的。
威廉·罗斯

不幸的是,如果我最初将数据库创建为“ sa”而不是Windows用户,这对我没有帮助
David Gardiner

“分离数据库时要小心”。告诉SSMS要小心。发生我的问题是因为使用SSMS的“复制数据库”命令失败,使我无法进行任何解释
Alan Macdonald

18

向您的文件夹添加权限 .mdf文件。

检查此名称: NT Service\MSSQLSERVER

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


5
要查找确切的帐户名,因为它随实例的不同而不同,请运行以下命令:SELECT servicename, service_account FROM sys.dm_server_services
阿维·史塔德

13

此问题是由UAC(用户帐户控制)引起的,不是吗?尽管您的用户帐户是Administrators组的成员,但是Windows 7中的UAC不允许您执行管理员操作,除非您以“以管理员身份”运行程序。它不是SQL Server或Management Studio或任何其他工具中的真正错误。(尽管它可能会知道问题所在,并要求您提高权限,而不仅仅是抱怨“错误5”。)


11

以管理员身份运行SQL Server Management Studio。(右键单击->以管理员身份运行)在Windows 7中为我工作-SQL Server 2008 R2


1
这个答案应该被赞成。以管理员身份运行SSMS可以解决此问题,它可以复制此答案。Microsoft在此处将其报告为“预期行为”:链接
FreeText

这与MandoMando的答案不一样吗?
mortb

10

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

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

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


这个工作与SQL Server 2016 Management Studio中2008 R2在Windows 10 :)

9

sa(或任何Sql Server帐户)身份登录时,您将充当SQL Server服务帐户,以您的身份登录时,您将拥有该帐户的权限。由于某些原因,您没有适当的文件访问权限,但服务帐户却具有。


NTFS问题也是我首先想到的问题,但这似乎不是问题:我是本地管理员组的成员,并且我验证了管理员对mdf和ldf文件具有“完全控制”权限。另外,我还是文件的所有者-我刚刚创建了一个目录,并将mdf / ldf文件复制到了自己的位置。
JMarsch 2010年

@JMarsch:@Nick表示“ sa”具有一组SQLSERVER权限-不是NTFS权限-您的帐户没有这些权限。
跋涉

@Trevoke:我和你在一起。如果是这种情况,那么我需要为我的用户帐户分配什么权限?(我已经被分配给sysadmin角色)
JMarsch 2010年

1
这是旧答案,但是对于五分钟前像我这样的人:您可以通过运行找到确切的服务用户名SELECT servicename, service_account FROM sys.dm_server_services
Arve Systad

6

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


5

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

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


5

和我一起-在窗口8上运行-依次单击SQL Server Manager Studio->以管理员身份运行。->没有问题


5

可以伊斯利固定的,但radicaly,只是去到已存储的文件夹mdf文件。选择文件->右键单击->单击属性,并为登录的用户安全性授予文件完整权限


3

每次遇到此问题时,都是尝试附加与SQL Server中设置的默认数据库目录不同的目录中的数据库。

我强烈建议您不要将数据文件移到sql server希望找到的目录中,而不必在各种目录和帐户上使用权限。


在很多情况下,我会同意您的观点,但是对于SQL Server,您通常希望能够将数据库定位在不同的心轴或卷上以实现可伸缩性。实际上,通常的做法是将事务日志放在与数据库分开的主轴上,以提高事务吞吐量。
JMarsch 2011年

@JMarsch:是的。这些目录实际上可以通过“服务器属性”>“数据库设置”选项卡进行配置,以获取默认数据和日志位置...
NotMe 2011年

这涵盖了默认值,但仅是默认值。将数据库放置在其他地方是完全可以接受的,如果您的服务器管理着1个以上的活跃使用的数据库,那甚至不是罕见的。
JMarsch 2011年

即使使用默认的sql服务器目录,我也有同样的问题:win7上的c:\ Program Files \ Microsoft SQL Server \ MSSQL10_50.SPATIAL_IM \ MSSQL \ DATA \ mydb.mdf。
goku_da_master 2011年

3

我只是想添加此信息。

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

您会收到此错误,因为两个不同的登录名执行了分离和附加操作。因此,分离后的文件归第一个登录名所有,但附加操作失败,因为使用的登录名不是mdf和ldf文件的所有者。

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

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

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


我在SSMS中更改了连接以匹配执行分离的用户,并且能够执行附加。
glitzsfa

2

对于具有我所遇到的这个问题的特定变体的任何人来说,这都是值得的:

  • SQL Express 2008
  • Visual Studio 2010专业版

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

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

这给了我数据库文件同样的“访问被拒绝”错误。我曾尝试向所有用户授予对文件夹和文件的完全控制权,甚至甚至对“每个人”都具有完全控制权。没有任何帮助,因此我再次删除了添加的权限。

最终解决的办法是在Visual Studio中打开服务器资源管理器,然后连接到MDF,然后再次分离。完成之后,我的Web应用程序就可以访问数据库了。

PS。鸣谢我搜索该特定问题时发现的这篇博客文章,触发了附加/分离数据库以解决问题的想法。


2

我将数据库mdf从默认的Data文件夹移到了asp.net app_data文件夹,并在尝试将数据库重新设置为联机时遇到了此问题。

我将原始位置的其他文件数据库的安全设置与移动的文件进行了比较,并注意到没有为MSSQL $ SQLEXPRESS分配新位置中的文件的权限。我添加了对“ NT SERVICE \ MSSQL $ SQLEXPRESS”(必须包括该NT SERVICE)的完全控制权,并且它的附加功能还不错。

似乎原始的数据文件夹具有这些权限,并且文件继承了它。移动文件,继承当然会中断。

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


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

1

这听起来像NTFS权限。这通常意味着您的SQL Server服务帐户具有对该文件的只读访问权限(请注意,无论您如何登录,SQL Server都使用相同的服务帐户来访问数据库文件)。您确定在自己登录和sa登录之间没有更改文件夹权限吗?如果分离并重试,是否仍然存在相同的问题?


就我而言,不-我将服务器时间重新设置为确定时间。问题是我的帐户只能通过间接级别访问文件-我是Domain Admin组的成员。Domain Admin是计算机上“本地管理员”组的成员,并且“本地管理员”(和系统)对该文件夹具有完全控制权。(因此,存在2个级别的组间接访问)。如果我直接给自己分配权限,那么它会起作用,如果删除了它们,我仍然可以从Explorere等复制/删除文件,但是SQL Server无法加载它们。
JMarsch

尝试附加数据库时。以的身份登录Windows authenticated user将有助于我们克服对数据库文件的许可。(在这种情况下,磁盘上的MS SQLServer实例具有Windows OS)。
做Nhu Vy

1

附加数据库时遇到相同的问题。这不是SQL问题,而是帐户问题。转到面板控件/用户帐户控件设置/设置为“从不通知”。最后,重新启动计算机,它对我有用。


1

我通过右键单击数据库并在向导中删除日志文件AdventureWorks2012_Data_log.ldf来附加mdf文件。mdf文件放置在以下位置

    C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA

上面的方法帮助我解决了这个问题。


1

我正在阅读此页面,他们那里有一个有趣的句子:

警告:将用户添加到这些角色时,请务必谨慎。例如,sysadmin映射到每个数据库中的dbo,等效于使用sa帐户登录。

当然,他们也有这个:

授予用户和角色的权限,特定于数据库。除DENY之外,所有权限都是累积性的。用户级别或角色级别的拒绝权限将覆盖通过其他角色成员身份授予的相同权限,但sysadmin固定服务器角色除外。(系统管理员将保留所有权限,即使他们所属的角色具有DENY权限也是如此。)

因此,如果您是域管理员并且在SQL'sysadmin'组中,那么世界就是您的甲壳纲。

当然,根据Microsoft的说法,您应该快速浏览以下两个页面:
链接到数据库先决条件

链接到安装数据库

您很顽皮,尝试手动附加它们:)但是,说真的,您是否具备AdventureWorks2008数据库的所有先决条件?
我怀疑这只是微软的另一个奇怪/边缘案例,但我可能是错的。


+1是因为您的评论帮助我找到了答案。我会将我的发现发布到此线程。顺便说一句(由于我工作的地方非常奇怪的政策,我很“调皮”-Adventureworks数据库作为exe分发。我无法下载exe的文件。(我可以下载zip文件和MSI文件,所以我看不到。exe文件真的过滤怎么做anythign除了碍事,但那些规则)不管怎样,我能得到的原始MDF文件从CodePlex上呼啸而过,那就是当我跑到这个小的好奇心。
JMarsch

1

在此处输入图片说明

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

谢谢,您保存了我的一天
Shahrokhian '18

1

我得到这个错误为sa。就我而言,数据库安全性无关紧要。我将所有人的完全控制权添加到了mdf和ldf文件中,并且附加效果很好。


1

我在VS 2019中遇到了相同的问题。如果有人仍然面临相同的问题,请确保您具有以下操作:

  1. 您应该在m / c上安装SQL Express
  2. 应该在VS(在VS 2019中-确保在安装时检查此组件)的早期版本中安装了SSDT-您必须在外部添加此组件
  3. 将“用户实例= True”添加到您的连接字符串中
  4. 我认为它是可选的-在管理模式下打开VS和SQL Express并以管理员身份登录到SQL Express

0

实际上,它是NTFS权限,并且是SQL Server中的一个奇怪的错误。我不确定上面的错误报告是否准确,或者可能涉及其他错误。

为了在Windows 7上解决此问题,我正常运行了SQL Server Management Studio(不是以管理员身份运行)。然后,我尝试附加MDF文件。在此过程中,我使用UI而不是粘贴在路径中。我注意到这条路被我切断了。这是因为软件为您添加的MS SQL Server(SQLServerMSSQLUser $ machinename $ SQLEXPRESS)用户没有访问该文件夹的权限(在这种情况下,该文件夹位于我自己的用户文件夹中)。

粘贴路径并继续操作会导致上述错误。所以-我授予MS SQL Server用户权限,以从拒绝它的第一个目录(我的用户文件夹)开始读取。然后,我立即取消了传播操作,因为它可能要花费一个永恒的时间,然后再次将读取权限应用于必要的下一个子文件夹,然后完全传播。

最后,我为MS SQL Server用户授予了对数据库的.mdf和.ldf文件的修改权限。

我现在可以附加到数据库文件。


0

如果您运行sql server 2012,则可以通过尝试附加旧版本的mdf文件来获取此错误。从sql server 2008获得一个mdf文件。


我认为那部分是相对自我解释的。知道如何进行分类将是很好的。
dansan

0

我已经解决了问题,只需将要附加的.mdf文件移动到公用文件夹,就我而言,我将其移动到users / public文件夹。然后,我从那里毫无问题地将其连接起来。希望这可以帮助。


0

对于那些无法使用此处的其他解决方案解决问题的人,以下修复程序对我有用:

转到SQL Server安装中的“ DATA”文件夹,右键单击,“属性”,“安全”选项卡,并为“ NETWORK SERVICE”用户添加完全控制权限。

http://decoding.wordpress.com/2008/08/25/sql-server-2005-expess-how-to-fix-error-3417/

(以上链接适用于SQL 2005,但这已为我修复了SQL 2008 R2的安装)。

一些其他信息:更换辅助硬盘驱动器(SQL安装已打开)后,出现了此问题。我复制了所有文件,并将原始驱动器号恢复到新硬盘上。但是,没有复制安全权限。我认为下一次我将使用更好的数据复制方法。


0

就我而言,解决问题的方法是:

USE [master]
GO
CREATE DATABASE [AdventureWorks2008R2] ON
( FILENAME = 'C:\Program Files\Microsfot SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\AdventureWors2008R2_Data.mdf')
FOR ATTACH_REBUILD_LOG

0

将数据库复制到另一个文件夹,然后使用“ Windows身份验证”附加或登录SQLServer

在此处输入图片说明


0

在分离数据库并将ldf和mdf文件从驱动器C移至F后重新附加数据库时,我遇到了相同的问题。

为了修复它,我必须在两个文件中添加“所有者权利”主体,并在“属性”对话框的“安全性”选项卡中对其进行完全控制。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.