附加数据库时拒绝访问

问题描述 投票:137回答:30

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

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

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

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

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

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

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

sql-server security administration
30个回答
153
投票

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

SQL SERVER EXPRESS 2008 R2。 Windows 7的


5
投票

它可以很容易地修复,但是从根本上来说,只需转到存储mdf文件的文件夹即可。选择文件 - >右键单击 - >单击属性,并为登录用户安全性的文件授予完全权限。


5
投票

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


4
投票

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

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


3
投票

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

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


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”文件执行此操作。完成此任务后,单击“确定”按钮。 (请注意,对于其他操作系统版本,您可能有“编辑”选项,请先单击此选项,然后您将看到“添加...”选项。)


2
投票

对于任何有这个问题的特定变化的人来说,我有什么价值:

  • SQL Express 2008
  • Visual Studio 2010 Premium

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

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

这给了我与数据库文件相同的“拒绝访问”错误。我尝试给各种用户完全控制文件夹和文件,甚至一点到“Everyone”。没有任何帮助,所以我再次删除了添加的权限。

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

PS。积分转到this blog post我在搜索这个特定问题时发现,触发了附加/分离数据库以解决问题的想法。


2
投票

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

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

原始Data文件夹似乎具有这些权限,文件继承它。当然,移动文件和继承中断。

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


1
投票

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


1
投票

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


1
投票

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

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

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


100
投票

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

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

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

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

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

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

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

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

更新:我报告这是一个错误:https://connect.microsoft.com/SQLServer/feedback/details/539703/access-denied-attaching-a-database-when-permissions-are-inherited


1
投票

我正在阅读this page,他们在那里有一个有趣的句子:

警告:在向这些角色添加用户时要非常有选择性。例如,sysadmin在每个数据库中映射到dbo,相当于使用sa帐户登录。

当然,他们也有这个:

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

因此,如果您是域管理员和SQL“系统管理员”组,那么世界应该是您的甲壳类动物。

当然,根据微软的说法,你应该快速浏览这两个页面: Link to Database Prerequisites

Link to Installing Databases

你是顽皮的并试图手动附加它们:)但是说真的,你有AdventureWorks2008数据库的所有先决条件吗? 我怀疑这只是微软的另一个奇怪/边缘情况,但我可能是错的。


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
投票

我把这个错误当作sa。就我而言,数据库安全无关紧要。我将每个人完全控制添加到mdf和ldf文件中,并且附件很顺利。


0
投票

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

要在Windows 7上解决此问题,我正常运行SQL Server Management Studio(而非管理员)。然后我尝试附加MDF文件。在这个过程中,我使用了UI而不是粘贴在路径中。我注意到路径被切断了。这是因为软件为您添加的MS SQL Server(SQLServerMSSQLUser $ machinename $ SQLEXPRESS)用户无权访问该文件夹(在本例中是我自己的用户文件夹深处的文件夹)。

粘贴路径并继续执行上述错误。所以 - 我给了MS SQL Server用户从第一个被拒绝的目录(我的用户文件夹)开始读取的权限。然后我立即取消了传播操作,因为它可能需要一段时间,并再次对下一个子文件夹应用读取权限,并让它完全传播。

最后,我给MS SQL Server用户修改了db的.mdf和.ldf文件的权限。

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


0
投票

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


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后重新附加数据库时,我遇到了同样的问题。

为了解决这个问题,我不得不在两个文件中添加OWNER RIGHTS主体,并在“属性”对话框的“安全”选项卡中完全控制它们。


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

0
投票

我努力使用SSMS(2016)来附加AdventureWorks2012数据库。但是这个代码取得了成功,取自a CodeProject article by Mohammad Elsheimy

CREATE DATABASE AdventureWorks2012
    ON PRIMARY (FILENAME='D:\Dev\SQL Server\AdventureWorks2012.mdf')
    FOR ATTACH;

17
投票

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

检查这个名字:NT Service\MSSQLSERVER

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


13
投票

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


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

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


8
投票

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


5
投票

和我一起 - 在Windows 8上运行 - 点击SQL Server Manager Studio - >使用admin运行。 - >没有问题

© www.soinside.com 2019 - 2024. All rights reserved.