附加数据库时拒绝访问

时间:2010-02-24 23:19:34

标签: sql-server security administration

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

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

  

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

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

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

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

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

31 个答案:

答案 0 :(得分:147)

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

SQL SRV EXPRESS 2008 R2。 Windows 7

答案 1 :(得分:97)

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

这是一个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

答案 2 :(得分:18)

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

分离数据库时要小心,因为您登录的 windows user 成为唯一拥有.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

答案 3 :(得分:15)

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

检查此名称:NT Service\MSSQLSERVER

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

答案 4 :(得分:13)

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

答案 5 :(得分:11)

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

答案 6 :(得分:9)

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

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

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

答案 7 :(得分:8)

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

答案 8 :(得分:5)

和我在一起 - 在窗口8上运行 - 点击SQL Server Manager Studio - &gt;使用admin运行。 - &GT;没有问题

答案 9 :(得分:5)

它可以轻松修复但是根本就是,只需转到存储 mdf文件的文件夹即可。选择文件 - &gt;右键单击 - &gt;单击属性,然后为登录用户安全性提供文件的完全权限。

答案 10 :(得分:4)

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

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

答案 11 :(得分:4)

我找到了这个解决方案:右键单击存储.mdf文件的文件夹 - &gt;单击属性 - &gt;选择Security选项卡,单击Edit ...并完全控制它。 希望这有帮助!

答案 12 :(得分:3)

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

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

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

答案 14 :(得分: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我在搜索这个特定问题时发现,触发了附加/分离数据库以解决问题的想法。

答案 15 :(得分:1)

我得到了这个错误。 就我而言,数据库安全无关紧要。 我添加了对mdf和ldf文件的完全控制权, 并且附件很顺利。

答案 16 :(得分:1)

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

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

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

答案 17 :(得分:1)

enter image description here

USE [master]
GO
CREATE DATABASE [DataBasename] ON 
( FILENAME = N'C:\data\DataBasename.mdf' )
 FOR ATTACH
GO

更改为    FOR ATTACH - &gt; FOR ATTACH_FORCE_REBUILD_LOG

USE [master]
GO
CREATE DATABASE [DataBasename] ON 
( FILENAME = N'C:\data\DataBasename.mdf' )
 FOR ATTACH_FORCE_REBUILD_LOG
GO

答案 18 :(得分:1)

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

答案 19 :(得分:1)

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

答案 20 :(得分:1)

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

  

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

当然,他们也有这个:

  

授予用户的权限   和角色,是特定于数据库的。   所有权限都是累积的   DENY除外。否认   用户级别的权限或   在角色级别覆盖相同的   通过其他角色授予的权限   会员资格除外   sysadmin固定服务器角色。 (一个   sysadmin甚至保留所有权限   如果他们是一个角色,他们有一个   DENY许可。)

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

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

Link to Installing Databases

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

答案 21 :(得分:1)

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

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

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

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

答案 22 :(得分:0)

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

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

答案 23 :(得分:0)

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

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

答案 24 :(得分:0)

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

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

答案 25 :(得分:0)

将数据库复制到另一个文件夹并使用&#34; Windows身份验证&#34;

附加或登录SQLServer

enter image description here

答案 26 :(得分: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

答案 27 :(得分: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安装所在的)后出现此问题。我复制了所有文件,并将原始驱动器号恢复到新硬盘。但是,未复制安全权限。我想下次我会用更好的方法复制数据。

答案 28 :(得分:0)

我已经通过移动要附加到公用文件夹的.mdf文件解决了问题,在我的情况下,我将其移动到users / public文件夹。然后我毫无问题地从那里附上它。希望这会有所帮助。

答案 29 :(得分:0)

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

答案 30 :(得分: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文件的权限。

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