附加数据库时拒绝访问

我正在使用 SQLServer2008开发者版本。我正在尝试附加 AdventureWorks2008数据库。

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

打开失败: 无法打开文件 D: ProjectData AdventureWorks AdventureWorksLT2008 _ Data. mdf,文件号为0。 OS 错误: 5(拒绝访问。)。

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

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

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

你知道我为什么要以 SA 的身份登录吗?

192965 次浏览

当您以 sa(或任何 SQL Server 帐户)登录时,您是作为 SQLServer 服务帐户运行的,当您以自己的身份登录时,您拥有帐户的权限。由于某些原因,您没有适当的文件访问权限,但服务帐户有。

我在读 这一页,里面有一句很有意思的话:

注意: 添加时要有选择性 这些角色。例如, 系统管理员映射到每个 数据库,相当于 使用 sa 帐户登录。

当然,他们也有这个:

授予用户的权限 和角色,并且是特定于数据库的。 所有权限累积为 否认的例外 用户级别的权限或 在角色级别覆盖相同的 通过其他角色授予的许可 除了 Sysadmin 固定服务器角色 系统管理员保留所有权限,甚至 如果他们所属的角色具有 拒绝许可。)

因此,如果你是一个域管理员和 SQL‘ sysadmin’组,世界应该是你的甲壳类动物。

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

链接到安装数据库

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

这听起来像是 NTFS 权限。这通常意味着您的 SQLServer 服务帐户只能读取该文件(注意,不管您如何登录,SQLServer 都使用相同的服务帐户来访问数据库文件)。您确定在以自己的身份登录和以 sa 的身份登录之间没有更改文件夹权限吗?如果您分离并再次尝试,是否仍然存在相同的问题?

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

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

谢谢你的评论。你们中的一些人帮助我找到了答案。以下是我的发现:

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

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

如果我尝试执行附加操作,以我的身份连接到 SQLServer (在管理员组中) ,那么 NTFS 问题会导致失败。

但是,如果我将本地管理组直接对我的域帐户授予相同的文件权限,那么我可以毫无问题地附加。

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

因此,看起来似乎出现错误是因为某些代码(在 SQLServer 或 ManagementStudio 中)检查用户帐户拥有的权限,但它并没有检查用户帐户继承的组权限。

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

更新: 我报告这是一个错误: < a href = “ https://Connect.microsoft.com/SQLServer/response/Details/539703/access- 拒絕-attaching- a-database-when-權-are-Heritage”rel = “ norefrer”> https://connect.microsoft.com/sqlserver/feedback/details/539703/access-denied-attaching-a-database-when-permissions-are-inherited

它实际上是 NTFS 权限,而且是 SQLServer 中的一个奇怪 bug。我不确定上面的错误报告是否准确,或者可能指的是另外一个错误。

为了在 Windows7上解决这个问题,我通常运行 SQLServerManagementStudio (而不是作为管理员)。然后,我尝试附加 MDF 文件。在这个过程中,我使用了 UI 而不是粘贴到路径中。我注意到那条路与我截断了。这是因为该软件为您添加的 MS SQL Server (SQLServerMSSQLUser $machinename $SQLEXPRESS)用户没有访问该文件夹的权限(在本例中是位于我自己的用户文件夹深处的一个文件夹)。

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

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

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

每次我遇到这个问题时,都是在尝试附加一个数据库时,该数据库位于 SQL 服务器中设置的默认数据库目录的另一个目录中。

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

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

我想在已经发布的答案中添加更多的信息。

分离数据库 时要小心,因为您所登录的 视窗使用者将成为对。Mdf 文件!原始权限。Mdf 文件包含用户 SQLServerMSSQLUser$<computer_name>$<instance_name>和管理员帐户,这些文件被您登录为的任何一个 Windows 用户(而不是 sql 服务器用户)覆盖。砰,所有权限就这么没了。所以按照别人说的去做,右键单击你的。Mdf 文件,并仔细检查权限。

我遇到这个问题是因为我使用 SSMS 连接到数据库(不管是哪个 sql 服务器帐户)并分离数据库。完成此操作后,我的 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

我得到了这个错误,作为 SA。 在我的例子中,数据库安全性并不重要。 我把所有人的完全控制权加入到 mdf 和 ldf 文件中, 连接顺利。

对于任何有这个问题的人来说,这是值得的:

  • SQL Express 2008
  • VisualStudio2010高级版

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

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

这使我在数据库文件中出现了相同的“拒绝访问”错误。我尝试给不同的用户完全控制的文件夹和文件,在一个点,甚至“每个人”。没有任何帮助,所以我再次删除了添加的权限。

最终解决 的方法是在 Visual Studio 中打开 Server Explorer,然后连接到 MDF,再次分离它。在我完成之后,我的网络应用程序就可以访问数据库了。

附言。学分归于我在谷歌这个特殊问题时发现的 这篇博文,触发了附加/分离数据库来解决这个问题的想法。

我通过右键单击数据库并删除日志文件来附加 mdf 文件 AdventureWorks2012 _ Data _ log. ldf 在向导中

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

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

以管理员身份运行 SQLServerManagementStudio。(右键单击-> 以管理员身份运行) ,它解决了我的情况中的所有怪异之处。

SQLSRVEXPRESS2008R2. Windows7

这个问题是由 UAC (用户帐户控制)引起的,不是吗?虽然您的用户帐户是管理员组的成员,但 Windows 7中的 UAC 不允许您做管理员的事情,除非您以“管理员”身份运行程序。在 SQLServer 或 ManagementStudio 或其他什么中,这不是一个真正的 bug。(尽管它可能知道问题并要求您提高权限,而不是仅仅抱怨“错误5”。)

如果运行 sql server 2012,则可以通过尝试附加 mdf 文件的旧版本来获得此错误。Ex sql server 2008中的一个 mdf 文件。

我已经解决了这个问题。您想要附加到公用文件夹的 mdf 文件,在我的示例中,我将它移动到 users/public 文件夹。然后我从那里连接它没有任何问题。希望这个能帮上忙。

对于那些不能用其他解决方案解决这个问题的人,下面的方法对我很有效:

转到 SQLServer 安装中的“ DATA”文件夹,右击属性、安全选项卡,并为“ NETWORKSERVICE”用户添加完全控制权限。

Http://decoding.wordpress.com/2008/08/25/sql-server-2005-expess-how-to-fix-error-3417/

(上面的链接是针对 SQL2005的,但是这为我修复了一个 SQL2008R2安装)。

一些附加信息: 这个问题出现在我更换了一个二级硬盘驱动器(SQL 安装在其上)之后。我复制了所有的文件,并将原始的驱动器号还原到新的硬盘上。但是,没有复制安全权限。我想下次我会用一个更好的方法来复制数据。

和我一起 在8号窗口运行 - 右键单击 SQLServerManagerStudio-> 用 admin 运行。-> 附加没有问题

我只是想把这个信息也加进去。

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

解决方案

之所以出现这个错误,是因为两个不同的登录名执行了分离和附加操作。因此,当分离时,这些文件属于第一个登录名所有,但是附加失败,因为所使用的登录名不是 mdf 和 ldf 文件的所有者。

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

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

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

以管理员身份运行 SQLServerManagementStudio。(右键单击-> 以管理员身份运行)在 Windows7-SQLServer2008R2上对我有效

它可以是 很容易修好,但从根本上说,只需要转到存储 Mdf 文件的文件夹。选择 file-> Right click-> click on properties and 为登录的用户安全性授予文件的完全权限

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

检查这个名字: NT Service\MSSQLSERVER

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

就我而言,解决这个问题的方法如下:

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 身份验证”附加或登录 SQLServer

enter image description here

我有同样的问题,当重新附加数据库后,分离和移动的 ldf 和 mdf 文件从驱动器 C 到 F。

为了解决这个问题,我不得不将 OWNER RIGHTS 主体添加到两个文件中,并在 Properties 对话框的 Security 选项卡中赋予它对这两个文件的完全控制权。

在 Windows7中,可以以这种方式附加 SQL2005数据库:

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

然后成功地完成了附件数据库的建立。

我将一个数据库 mdf 从缺省 Data 文件夹移动到 asp.net app _ Data 文件夹,并在试图将数据库重新设置为在线时遇到了这个问题。

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

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

我检查了另一个项目的 mdf 文件,我直接创建到它的 app _ data 文件夹中。它没有 MSSQL $SQLEXPRESS 权限。嗯。我想知道为什么 SQLExpress 喜欢其中一个而不是另一个?

我找到了这个解决方案: 右键单击存储文件夹。Mdf file —— > click Properties —— > select Security tab,click Edit... and give it full control mdf file —— > 单击 Properties —— > 选择 Security 选项卡,单击 Edit..。 希望这个能帮上忙!

我努力使用 SSMS (2016)附加 AdventureWorks2012数据库。但是在这个代码上取得了成功,这个代码来自于 CodeProject 的一篇文章 穆罕默德 · 埃尔谢米(Mohammad Elsheimy)

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

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

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

  1. 你的信用卡上应该安装了 SQL Express
  2. 应该在 VS 中安装了 SSDT (在 VS2019中-请确保进行检查 这个组件,而安装)以前的版本-您 必须在外部添加这个组件
  3. 将“ User Instance = True”添加到连接字符串中
  4. 我认为它是可选的——在管理模式下打开 VS 和 SQLExpress,并作为管理员登录到 SQLExpress