【问题标题】:Access is denied when attaching a database附加数据库时拒绝访问
【发布时间】:2011-01-20 18:54:07
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • MDF文件被加密了吗?
  • 不——我真正好奇的是,如果我以 sa 身份登录(使用 Management Studio),它可以正常工作,但如果我使用本地管理员帐户,它就无法正常工作。我的帐户是管理员,域管理员,这是我在安装 SQL Server 时登录的帐户(在安装过程中,有一个选项可以使我的当前帐户成为系统管理员,我这样做了)。
  • 这就是 UAC 在 W7 中的工作方式,不足为奇。
  • @AlKepp 不——不是 UAC 的事情。只需以 sa 身份登录即可纠正(SQL 服务器帐户,与 UAC 无关)问题。此外,只要成为本地管理员组的成员,我就可以获得我的权限——我不必提升我的 AD 凭据才能工作。

标签: sql-server security administration


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      如果我尝试进行附加,以我的身份连接到 SQL Server(我在 admins 组中),它会因 NTFS 问题而失败。

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

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

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

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

      更新:我将此报告为错误:https://connect.microsoft.com/SQLServer/feedback/details/539703/access-denied-attaching-a-database-when-permissions-are-inherited

      【讨论】:

      • 如果像我一样使用 Windows 7,则必须以管理员身份运行 SQL Server Management Studio 以避免出现此错误。
      • 使用 SS2008 Express 在 Win7 Pro 上复制。 sqlcmd 和 SSMS 的问题相同。 == Meldung '5120',Ebene '16',状态 '101',服务器 'DAGO\SQLEXPRESS',Zeile 1 - 'Die physische Datei'D:\data\mssql\drei.mdf' kann nicht geöffnet werden。 Betriebssystemfehler 5: '5(Zugriff verweigert) == 授予用户完全访问权限(该用户是具有访问权限的本地管理员组的成员)解决了该问题。此外,以管理员身份运行 sqlcmd(或 SSMS,我猜)不会产生此错误。
      • Anthony Highsky 给出了答案。只需确保以管理员身份运行 Management Studio。
      • 对我来说同样的问题和解决方案。 2008R2、Win 7 等。刚刚将我自己明确添加到安全列表中,它就起作用了。我想 SQL Server 可以读取它们,一旦附加,但在附加时不能在我的凭据下?
      • 以管理员身份运行 Management Studio 对我不起作用。尝试启动 windows 服务时出现此错误。
      【解决方案4】:

      我在使用 SSMS (2016) 来附加 AdventureWorks2012 数据库时遇到了困难。但是这段代码取得了成功,取自a CodeProject article by Mohammad Elsheimy

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

      【讨论】:

        【解决方案5】:

        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
        

        【讨论】:

        • 谢谢,你拯救了我的一天
        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

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

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

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

          【讨论】:

          • 在将日志文件移动到单独的磁盘时,此解决方案在 Windows 10 和 SQL Server 2017 上适用于我。在我的情况下,用户名是“NT SERVICE\MSSQLSERVER”
          【解决方案8】:

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

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

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

          【讨论】:

          • 这适用于 SQL Server 2016 和 Windows 10 上的 Management Studio 2008 R2 :)
          【解决方案9】:

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

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

          【讨论】:

            【解决方案10】:

            我也只是想添加这些信息。

            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... 选项。)

            【讨论】:

            • 我更改了 SSMS 中的连接以匹配执行分离的用户,并且我能够执行附加。
            【解决方案11】:

            我正在阅读this page,其中有一个有趣的句子:

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

            当然,他们也有这个:

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

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

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

            Link to Installing Databases

            您太顽皮了,还想手动附加它们 :) 说真的,您是否具备 AdventureWorks2008 数据库的所有先决条件?
            我怀疑这只是 Microsoft 的另一个奇怪/边缘案例,但我可能是错的。

            【讨论】:

            • +1 因为您的评论帮助我找到了答案。我会将我的发现发布到这个线程。顺便说一句(由于我工作的地方非常奇怪的政策,我很“顽皮”——adventureworks 数据库作为 exe 分发。我无法下载 exe。(我可以下载 zip 文件和 MSI 文件,所以我看不到exe 过滤除了碍事之外实际上是如何做任何事情的,但这些都是规则)。无论如何,我可以从 codeplex 获取原始 mdf 文件作为 zip 文件,这就是我遇到这个小好奇心的时候。
            【解决方案12】:

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

            【讨论】:

              【解决方案13】:

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

              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
              

              【讨论】:

                【解决方案14】:

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

                检查这个名字:NT Service\MSSQLSERVER

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

                【讨论】:

                • 要找到准确的帐户名称,因为它可能因实例而异,请运行:SELECT servicename, service_account FROM sys.dm_server_services
                【解决方案15】:

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

                【讨论】:

                  【解决方案16】:

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

                  【讨论】:

                  • 这个答案应该被赞成。以管理员身份运行 SSMS 是一种复制此答案的解决方法。 Microsoft 在此处将其报告为“预期行为”:link
                  • 这不是和MandoMando的回答一样吗?
                  【解决方案17】:

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

                  【讨论】:

                    【解决方案18】:

                    对于那些无法在此处使用其他解决方案解决问题的人,以下修复对我有用:

                    在你的 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 安装已打开)后,我发现了这个问题。我复制了所有文件,并将原始驱动器号恢复到新硬盘。但是,没有复制安全权限。我想下次我会使用更好的方法来复制数据。

                    【讨论】:

                      【解决方案19】:

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

                      【讨论】:

                        【解决方案20】:

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

                        【讨论】:

                          【解决方案21】:

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

                          【讨论】:

                          • 我认为那部分是相对不言自明的。最好知道如何解决。
                          【解决方案22】:

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

                          SQL SRV EXPRESS 2008 R2。视窗 7

                          【讨论】:

                          • 以管理员身份运行 Management Studio 对我不起作用。尝试启动 windows 服务时出现此错误。
                          • 以管理员身份运行是第一步。第二步是通过 Windows 身份验证登录到 SQL Server。 (这个方法对我有用!)
                          • 也为我工作。无法用语言表达 Windows 上的权限提示和错误是多么令人厌烦和沮丧。我是管理员!
                          • 也为我工作。起初我不认为它会起作用,因为 SSMS 只是一个 UI 客户端。我认为需要以管理员身份运行该服务。但是以管理员身份运行 SSMS 就足够了。
                          • 也为我工作。 SQL Server 2019,SSMS 18.4
                          【解决方案23】:

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

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

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

                          【讨论】:

                            【解决方案24】:

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

                            • SQL Express 2008
                            • Visual Studio 2010 高级版

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

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

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

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

                            PS。致谢 this blog post 我在谷歌搜索这个特定问题时发现,触发了附加/分离数据库以解决问题的想法。

                            【讨论】:

                              【解决方案25】:

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

                              分离数据库时要小心,因为您登录的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
                              

                              【讨论】:

                              • 谢谢!我认为如果您还使用具有 serveradmin 权限的 SQL Server Authenticated 帐户登录,那么正确操作会容易得多。
                              • 不幸的是,如果我最初将数据库创建为“sa”而不是 Windows 用户,这对我没有帮助
                              • “分离数据库时要小心”。告诉 SSMS 要小心。我的问题发生是因为使用 SSMS 复制数据库命令失败,让我在轴城没有任何解释
                              【解决方案26】:

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

                              【讨论】:

                                【解决方案27】:

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

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

                                【讨论】:

                                • 在很多情况下,我同意您的观点,但是对于 SQL Server,您通常希望能够将数据库定位在不同的轴或卷上以实现可扩展性。事实上,为了提高事务吞吐量,将事务日志放在与数据库不同的主轴上是一种常见的做法。
                                • @JMarsch: 是的.. 目录实际上可以通过服务器属性 > 数据库设置选项卡来配置默认数据和日志位置...
                                • 这涵盖了默认值,但这只是默认值。将 dbs 放在其他地方是完全可以接受的,如果您的服务器管理超过 1 个活跃使用的数据库,这甚至不常见。
                                • 即使使用默认的 sql server 目录,我也有同样的问题:c:\Program Files\Microsoft SQL Server\MSSQL10_50.SPATIAL_IM\MSSQL\DATA\mydb.mdf on win7。
                                【解决方案28】:

                                其实是NTFS权限,是SQL Server的一个奇怪bug。我不确定上述错误报告是否准确,或者可能涉及其他错误。

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

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

                                最后,我授予 MS SQL Server 用户对 db 的 .mdf 和 .ldf 文件的修改权限。

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

                                【讨论】:

                                  【解决方案29】:

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

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

                                  【讨论】:

                                    【解决方案30】:

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

                                    【讨论】:

                                    • 在我的情况下,不——我重新做了几次以确保。问题是我的帐户只能通过间接级别访问文件——我是组域管理员的成员。域管理员是机器上本地管理员组的成员,本地管理员(和系统)拥有对该文件夹的完全控制权。 (所以有 2 个级别的组间接)。如果我直接为自己分配权限,它会起作用,如果我删除它们,我仍然可以从 Explorere 等复制/删除文件,但 SQL Server 无法加载它们。
                                    • 尝试附加数据库时。以Windows authenticated user 登录将帮助我们克服对数据库文件的权限。 (这种情况下,磁盘中的 MS SQLServer 实例具有 Windows 操作系统)。
                                    猜你喜欢
                                    • 2016-07-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2018-06-17
                                    • 2020-12-07
                                    • 2016-03-02
                                    • 2014-04-17
                                    相关资源
                                    最近更新 更多