代码之家  ›  专栏  ›  技术社区  ›  JMarsch

附加数据库时拒绝访问

  •  134
  • JMarsch  · 技术社区  · 14 年前

    我使用的是SQLServer2008开发者版。我正试图连接AdventureWorks2008数据库。

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

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

    我发现,如果我以sa身份登录,我可以成功连接数据库,但我的用户帐户无法工作。

    我是计算机上本地管理员组的成员,在SQL Server实例中担任系统管理员角色。

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

    30 回复  |  直到 13 年前
        1
  •  172
  •   MandoMando    12 年前

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

    SQL SRV EXPRESS 2008 R2。视窗7

        2
  •  107
  •   Noah Hawkins JMarsch    6 年前

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

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

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

    如果我尝试执行附加,以我的身份连接到SQL Server(我在admins组中),它将失败,并出现NTFS问题。

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

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

    更新: 我报告这是一个bug: https://connect.microsoft.com/SQLServer/feedback/details/539703/access-denied-attaching-a-database-when-permissions-are-inherited

        3
  •  20
  •   goku_da_master    13 年前

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

    分离数据库时要小心 因为 windows用户 您以成为唯一具有.mdf文件权限的用户的身份登录!.mdf文件包含用户的原始权限 SQLServerMSSQLUser$<computer_name>$<instance_name>

    我遇到这个问题是因为我使用SSMS连接到数据库(不管是哪个sql server帐户)并分离了数据库。在此之后,我的windows用户是唯一拥有.mdf文件权限的用户。因此,后来当我尝试使用sa帐户连接db时,它抛出了“拒绝访问”错误。

    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
    
        4
  •  20
  •   gvlasov    10 年前

    将权限添加到您的 .mdf 文件是。

    选中此名称: NT Service\MSSQLSERVER

    并更改 Location 到您的服务器名。

        5
  •  14
  •   Rolwin Crasta    10 年前

    以管理员身份运行SQL Server Management Studio(右键单击->以管理员身份运行)在Windows 7-SQL server 2008 R2上为我工作

        6
  •  13
  •   Al Kepp    11 年前

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

        7
  •  10
  •   Artjom B.    9 年前

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

    然后连接数据库成功完成。

        8
  •  9
  •   Nick Craver    14 年前

    当您以 sa

        9
  •  6
  •   dnguyen    8 年前

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

        10
  •  5
  •   djeidot    14 年前

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

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

        11
  •  5
  •   Wolf    10 年前

    -在8号窗口上运行 -右键单击SQL Server Manager Studio->与管理员一起运行-&燃气轮机;没有问题

        12
  •  5
  •   Ema.H    10 年前

    可能是 轻松地固定 mdf文件 . 选择文件->右键单击->单击属性和 .

        13
  •  3
  •   ChrisLively    13 年前

    我强烈建议您只需将数据文件移动到sql server希望找到的目录中,而不是使用对各种目录和帐户的权限进行劫持。

        14
  •  3
  •   stormwild    9 年前

    我只是想补充一下这些信息。

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

    解决方案

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

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

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

        15
  •  2
  •   Jeroen    12 年前

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

    • Visual Studio 2010高级版

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

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

    是什么最终解决了这个问题 在VisualStudio中打开服务器资源管理器,然后连接到MDF,然后再次将其分离。在我完成这项工作后,我的web应用程序可以很好地访问数据库。

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

        16
  •  2
  •   Brad Mathews    8 年前

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

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

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

        17
  •  2
  •   toddmo    5 年前

    就我而言,数据库安全性并不重要。 我把所有人都完全控制了mdf和ldf文件, 一切顺利。

        18
  •  1
  •   Adrian O'Connor    14 年前

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

        19
  •  1
  •   Paola    13 年前

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

        20
  •  1
  •   praveen    12 年前

    我通过右键单击数据库并删除日志文件来附加mdf文件

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

        21
  •  1
  •   sudhansu63    9 年前

    我在看书 this page 他们有一句很有趣的话:

    注意:添加时要非常有选择性 用户可以访问这些角色。例如 sysadmin映射到每个数据库中的dbo 数据库,相当于

    当然,他们也有:

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

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

    当然,根据Microsoft的说法,您应该快速查看以下两个页面:
    Link to Database Prerequisites

    Link to Installing Databases


    我怀疑这只是另一个微软古怪/边缘案例,但我可能错了。

        22
  •  1
  •   Valentin Petkov    7 年前

    enter image description here

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

    对于附件-->用于附加\u力\u重建\u日志

    USE [master]
    GO
    CREATE DATABASE [DataBasename] ON 
    ( FILENAME = N'C:\data\DataBasename.mdf' )
     FOR ATTACH_FORCE_REBUILD_LOG
    GO
    
        23
  •  0
  •   Chris Moschini    13 年前

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

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

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

    最后,我给了MS SQL Server用户对数据库的.mdf和.ldf文件的修改权限。

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

        24
  •  0
  •   Erik Forsmyr    12 年前

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

        25
  •  0
  •   databaseUser    11 年前

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

        26
  •  0
  •   marknuzz    11 年前

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

    转到SQL Server安装中的“数据”文件夹,右键单击“属性”、“安全”选项卡,然后为“网络服务”用户添加完全控制权限。

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

    (上面的链接是针对SQL 2005的,但这为我修复了SQL 2008 R2安装)。

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

        27
  •  0
  •   Nick_    9 年前

    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
    
        28
  •  0
  •   ChÆ°a biết    9 年前

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

    enter image description here

        29
  •  0
  •   Art    9 年前

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

        30
  •  0
  •   Cody Gray    7 年前

    a CodeProject article by Mohammad Elsheimy :

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