连接数据库时访问被拒绝

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

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

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

我以为“NTFS问题”,但系统(和我)已修改访问这两个文件。

我发现我可以成功地连接数据库,如果我login为sa,但我的用户帐户将无法正常工作。

我是我的机器上的本地pipe理员组的成员,而且我在SQL Server实例中的sysadminsangular色中。

任何想法,为什么我必须login为SA?

以pipe理员身份运行SQL Server Management Studio。 (右键 – >以pipe理员身份运行),照顾我的情况下的所有古怪。

SQL SRV EXPRESS 2008 R2。 Windows 7的

感谢您的所有意见。 你们有些人帮助我find答案。 这是我发现的:

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

问题:我正在使用的帐户具有完全控制mdf和ldf文件的NTFS权限。 但是,它具有通过组成员的权限(本地pipe理员组拥有权限,而我的帐户是本地pipe理员的成员)。 (我validation了权限)

如果我尝试执行附加,连接到SQL Server作为我(我在pipe理员组中),它与NTFS问题失败。

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

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

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

这听起来很奇怪,但我可以一遍又一遍地重复,所以我必须得出结论,这是答案。

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

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

分离数据库时要小心,因为您login的Windows用户成为拥有.mdf文件权限的唯一用户! .mdf文件的原始权限包含用户SQLServerMSSQLUser$<computer_name>$<instance_name> ,并且pipe理员帐户被您login为(不是sql server用户)的任何Windows用户覆盖。 繁荣,所有的权限就这样。 所以如别人所说,右键单击您的.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 

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

选中这个名字: NT Service\MSSQLSERVER

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

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

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

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

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

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

以pipe理员身份运行SQL Server Management Studio。 (右键 – >以pipe理员身份运行)用Windows 7 – SQL Server 2008 R2为我工作

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

我不知道是否能解决你的问题,因为你说你没有问题的用户,但我希望它可以帮助。

与我 – 在窗口8上运行 – 右键单击​​SQL Server Manager Studio – >与pipe理员一起运行。 – >附加没有问题

它可以固定宽松,但激进的,只是去你的文件夹存储MDF文件 。 select文件 – >右键单击 – >点击属性,并给予login用户安全文件的完整权限

每当我遇到这个问题时,试图附加一个数据库是在SQL服务器中设置的默认数据库目录不同的目录中。

我强烈build议,而不是顶起各种目录和帐户的权限,你只需将您的数据文件移动到SQL Server期望find它的目录。

我只是想添加这个信息。

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

你得到这个错误,因为两个不同的login做了分离和附加操作。 所以这些文件在被分离时被第一次login所拥有,但是由于所使用的login不是mdf和ldf文件的所有者,所以连接失败。

当我们分离数据库文件时,所有者变成了执行分离命令的人,为了解决这个问题,我们需要改变或者添加其他login名作为mdf和ldf文件的所有者。

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

要解决此问题,请单击“添加…”button以添加其他login名或所需的任何其他login名,并为其提供完全控制login。 你也应该这样做“ldf”文件。 完成此任务后,单击确定button。 (注意其他操作系统版本,你可能有一个编辑选项,先点击这个,然后你会看到添加…选项。)

我发现这个解决scheme:右键单击存储.mdf文件的文件夹 – >单击属性 – >select安全选项卡,单击编辑…并完全控制它。 希望这可以帮助!

对于有这个问题的特殊变化的人来说,我有这样的价值:

  • SQL Express 2008
  • Visual Studio 2010 Premium

通过App_data文件夹的上下文菜单,我创build了一个用于debugging目的的SQL Express数据库。 连接string(由NHibernate使用)如下所示:

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

这给了我相同的数据库文件上的“访问被拒绝”错误。 我试图给各种用户完全控制文件夹和文件,甚至一度甚至“大家”。 没有什么帮助,所以我再次删除了添加的权限。

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

PS。 积分去到这个博客文章,当googlesearch这个特定的问题,触发想法附加/分离数据库来解决这个问题。

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

连接数据库时遇到同样的问题。 这不是一个SQL问题,这是一个帐户问题。 转到面板控制/用户帐户控制设置/设置为“从不通知”。 最后,重新启动电脑,它为我工作。

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

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

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

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

警告:将用户添加到这些angular色时要非常有select性。 例如,sysadmin映射到每个数据库中的dbo,相当于使用sa帐户login。

当然,他们也有这个:

授予用户和angular色的权限和数据库特定的权限。 除DENY外,所有权限都是累积的。 在用户级别或angular色级别的拒绝权限会覆盖通过其他angular色成员授予的相同权限(sysadmin固定服务器angular色除外)。 (系统pipe理员保留所有权限,即使他们所属的angular色具有DENY权限。)

所以,如果你是一个域pipe理员,并在SQL“系统pipe理员”组,世界应该是你的甲壳类动物。

当然,根据微软的说法,你应该快速浏览一下这两个页面:
链接到数据库先决条件

链接到安装数据库

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

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

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

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

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

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

我得到这个错误为sa。 就我而言,安全并不重要。 我添加了所有人对mdf和ldf文件的完全控制权,并且附加进行的很好。

如果你运行sql server 2012,你可以通过尝试附加一个旧版本的mdf文件来得到这个错误。 从SQL Server 2008中得到一个mdf文件。

我已经解决了这个问题,只需要移动你想附加到公共文件夹的.mdf文件,在我的情况下,我把它移动到用户/公共文件夹。 然后我从那里附上,没有任何问题。 希望这可以帮助。

对于那些不能解决这个问题的人来说,下面的解决scheme适用于我:

转到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的安装问题)。

一些额外的信息:这个问题出现在replace一个辅助硬盘驱动器(SQL安装)之后。 我复制了所有文件,并将原始驱动器号恢复到新的硬盘上。 但是,安全权限并未被复制。 我想下次我会用更好的方法来复制数据。

在我的情况下是什么解决了这个问题是如下:

 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 

将数据库复制到其他文件夹并使用“Windows身份validation”附加或loginSQLServer

在这里输入图像说明

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

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

我将数据库mdf从默认的Data文件夹移到了我的asp.net app_data文件夹中,并遇到了这个问题,试图将数据库设置回联机状态。

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

原来的Data文件夹似乎具有这些权限,文件inheritance它。 当然移动文件和inheritance中断。

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

在这里输入图像说明

 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 

我努力与SSMS(2016年)附加AdventureWorks2012数据库。 但是,这个代码取自Mohammad Elsheimy的CodeProject文章 :

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