连接数据库时出现“访问被拒绝”的错误提示

159

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

当我尝试附加时,出现了“拒绝访问”的错误。根据事件日志,这是来自操作系统的:

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

我认为这是“NTFS问题”,但是我的系统和我都具有两个文件的修改权限。

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

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

为什么我必须以sa身份登录才能成功附加数据库?


MDF文件是否加密了? - Brettski
不,对我来说真正好奇的是,如果我使用 sa(使用管理工具)登录,则可以正常工作,但如果我使用本地管理员帐户,则无法正常工作。我的帐户是管理员,域管理员,并且在安装 SQL Server 时我使用的就是这个帐户(在设置期间有一个选项可以将我的当前帐户设置为 sysadmin,我也这样做了)。 - JMarsch
1
这就是W7中UAC的工作方式,毫不意外。 - Al Kepp
@AlKepp 不是UAC的问题。只需使用sa登录(SQL服务器帐户,与UAC无关)即可解决问题。此外,仅通过成为本地管理员组的成员,我就可以获得我的权限 - 我不必提升权限才能使我的AD凭据工作。 - JMarsch
31个回答

1

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


1

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

注意:在将用户添加到这些角色时要非常谨慎。例如,sysadmin在每个数据库中都映射到dbo,并且相当于使用sa帐户登录。

当然,他们还有这个:

授予用户和角色的权限是特定于数据库的。所有权限都是累积的,除了DENY。无论是在用户级别还是在角色级别上拒绝的权限都会覆盖通过其他角色成员身份授予的相同权限,但sysadmin固定服务器角色除外。(sysadmin保留所有权限,即使他们所属的角色具有DENY权限。)

因此,如果您是域管理员并且在SQL“sysadmin”组中,则世界应该是您的。

当然,根据微软的说法,您应该快速查看以下两个页面:
数据库先决条件链接

安装数据库链接

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


+1 因为你的评论帮助我找到了答案。我会在这个帖子中发布我的发现。顺便说一句(由于我工作的非常奇怪的政策,我有点“淘气”-- adventureworks数据库被分发为exe文件。我不能下载exe文件。(我可以下载zip文件和MSI文件,所以我不明白exe过滤器真正起到了什么作用,除了阻碍外,但这就是规定)。无论如何,我可以从codeplex获取原始的mdf文件并将其压缩成zip文件,那时我遇到了这个小奇怪事情。 - JMarsch

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

在我的情况下,不是这样的 - 我重新做了几次以确保。问题在于我的帐户只能通过一个间接层次访问文件 - 我是域管理员组的成员。 域管理员组是该计算机上本地管理员组的成员,而本地管理员(和系统)对该文件夹拥有完全控制权(因此存在2个级别的组间接)。如果我直接分配权限给自己,它可以工作;如果我删除了它们,我仍然可以从资源管理器中复制/删除文件等操作,但 SQL Server 无法加载它们。 - JMarsch
当尝试附加数据库时,以“Windows身份验证用户”登录将有助于我们克服数据库文件上的权限问题。(在这种情况下,MS SQLServer实例位于具有Windows操作系统的磁盘上)。 - Raphaël Colantonio

1

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

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

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


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

在将数据库从C盘移动到F盘并分离后重新附加时,我遇到了同样的问题。

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


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

我已经解决了这个问题,只需要将要附加的.mdf文件移动到公共文件夹中,例如我将其移动到了users/public文件夹中。然后我可以从那里附加它而不会出现任何问题。希望这可以帮助到你。


0
如果您运行的是SQL Server 2012,尝试附加旧版本的MDF文件(例如来自SQL Server 2008的MDF文件)可能会导致此错误。

我认为那部分相对来说比较容易理解。知道如何解决它会很好。 - dansan

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接