154

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

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

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

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

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

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

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

4

31 回答 31

177

以管理员身份运行 SQL Server Management Studio。(右键单击-> 以管理员身份运行)在我的情况下处理了所有奇怪的问题。

SQL SRV 快递 2008 R2。Windows 7的

于 2012-05-22T18:18:35.273 回答
110

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

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

问题:我使用的帐户对 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

于 2010-03-05T18:04:51.523 回答
21

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

分离数据库时要小心,因为您登录的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
于 2011-10-26T15:48:59.443 回答
21

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

检查此名称:NT Service\MSSQLSERVER

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

于 2015-02-04T16:17:43.443 回答
14

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

于 2014-08-27T09:50:36.073 回答
13

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

于 2012-06-16T01:52:49.073 回答
10

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

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

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

于 2015-12-11T14:50:52.583 回答
9

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

于 2010-02-24T23:27:52.553 回答
7

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

于 2016-10-01T07:40:28.560 回答
5

它可以轻松但彻底地修复,只需转到您存储mdf 文件的文件夹即可。选择文件->右键单击->单击属性并为登录用户授予对文件的完全权限 Security

于 2014-09-19T09:12:06.580 回答
5

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

于 2014-02-27T14:02:48.480 回答
5

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

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

于 2010-03-05T13:08:06.920 回答
3

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

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

于 2011-04-08T00:17:21.817 回答
3

我也只想添加这些信息。

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

解决方案

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

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

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

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

于 2014-03-01T07:33:29.057 回答
2

我得到了这个错误作为 sa。就我而言,数据库安全并不重要。我将每个人都完全控制到 mdf 和 ldf 文件中,并且附加成功。

于 2011-11-14T15:34:51.580 回答
2

对于任何遇到我遇到的这个问题的特殊变化的人来说,这是值得的:

  • SQL 速成 2008
  • Visual Studio 2010 高级版

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

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

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

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

PS。信用转到我在谷歌搜索这个特定问题时发现的这篇博客文章,触发了附加/分离数据库以解决问题的想法。

于 2012-03-06T21:48:58.817 回答
2

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

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

看来原始数据文件夹具有这些权限,并且文件继承了它。当然,移动文件和继承中断。

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

于 2016-02-18T05:36:34.187 回答
1

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

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

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

于 2012-04-26T15:03:01.443 回答
1

我正在阅读此页面,其中有一个有趣的句子:

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

当然,他们也有这个:

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

因此,如果您是域管理员并且在 SQL 'sysadmin' 组中,那么世界应该是您的甲壳类动物。

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

链接到安装数据库

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

于 2010-03-02T13:57:29.220 回答
1

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

于 2011-09-01T16:42:09.940 回答
1

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

于 2010-03-05T12:25:26.467 回答
1

我在 VS 2019 中遇到了同样的问题。如果有人仍然面临同样的问题,请确保您有/做以下事情:

  1. 您应该在您的 m/c 上安装 SQL Express
  2. 对于以前的版本,应该在 VS 中安装 SSDT(在 VS 2019 中-确保在安装时检查此组件)-您必须在外部添加此组件
  3. 将“用户实例 = True”添加到您的连接字符串
  4. 我认为它是可选的 - 在管理模式下打开 VS 和 SQL Express 并以管理员身份登录到 SQL Express
于 2020-02-10T17:42:56.700 回答
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
于 2017-09-03T02:57:20.443 回答
0

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

于 2013-08-26T00:44:37.233 回答
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 文件的修改权限。

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

于 2011-04-08T00:12:51.410 回答
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
于 2015-02-21T14:13:34.773 回答
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 安装已打开)后,我出现了这个问题。我复制了所有文件,并将原始驱动器号恢复到新硬盘。但是,没有复制安全权限。我想下次我会使用更好的方法来复制数据。

于 2013-12-10T20:15:47.660 回答
0

如果您运行 sql server 2012,您可能会通过尝试附加旧版本的 mdf 文件来获得此错误。例如来自 sql server 2008 的 mdf 文件。

于 2012-10-18T09:23:24.213 回答
0

将数据库复制到其他文件夹并使用“Windows 身份验证”附加或登录 SQLServer

在此处输入图像描述

于 2015-05-16T08:23:41.450 回答
0

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

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

于 2015-11-30T14:17:45.023 回答
0

我努力使用 SSMS (2016) 来附加 AdventureWorks2012 数据库。但这段代码取得了成功,取自Mohammad Elsheimy 的 CodeProject 文章

CREATE DATABASE AdventureWorks2012
    ON PRIMARY (FILENAME='D:\Dev\SQL Server\AdventureWorks2012.mdf')
    FOR ATTACH;
于 2017-01-27T03:42:13.847 回答