CREATE DATABASE ... FOR ATTACH 中的访问被拒绝错误

Han*_*non 7 sql-server sql-server-2012

我正在尝试将 的副本附加msdb到 Windows 8.1 上的工作站 SQL Server 2012 开发人员版,以尝试模仿此问题中详述的问题,其中 OP 试图从外部 msdb 中重新创建丢失的作业。

我执行了以下操作:

use master;

backup database msdb to disk='C:\sqlserver\test.bak';
go
restore database msdbtest from disk='c:\sqlserver\test.bak' 
    with move 'MSDBData' to 'C:\SQLServer\Data\msdbtest_data.mdf'
    , move 'MSDBLog' TO 'C:\SQLServer\Logs\msdbtest_log.ldf';
go
Run Code Online (Sandbox Code Playgroud)

然后我停止了 SQL Server 服务,制作了C:\SQLServer\Data\msdbtest_data.mdf和的副本C:\SQLServer\Logs\msdbtest_log.mdf,然后重新启动了 SQL Server。

然后我执行了以下操作:

drop database msdbtest;
go
create database msdbtest on (
    name='msdbtest_data'
    ,filename='c:\sqlserver\data\msdbtest_data.mdf'
) log on (
    name='msdbtest_log'
    , filename='c:\sqlserver\log\msdbtest_log.ldf'
) for attach;
Run Code Online (Sandbox Code Playgroud)

这导致:

Msg 5120, Level 16, State 101, Line 1
Unable to open the physical file "c:\sqlserver\data\msdbtest_data.mdf". 
Operating system error 5: "5(Access is denied.)".
Run Code Online (Sandbox Code Playgroud)

SQL Server 配置了服务帐户的默认开箱即用设置:

在此处输入图片说明

SQL Server 服务帐户的安全有效访问c:\sqlserver\data\msdbtest_data.mdf是:

在此处输入图片说明

我不知所措;我认为返回的错误误导了我。也许我误解了目的CREATE DATABASE ... FOR ATTACH

据我所知,SQL Server 当然应该可以访问该文件。该文件夹C:\SQLServer\Data由当前附加到实例的所有其他用户数据库使用。

SELECT @@VERSION 返回:

Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
Dec 28 2012 20:23:12 
Copyright (c) Microsoft Corporation
Developer Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
Run Code Online (Sandbox Code Playgroud)

Mik*_*lsh 7

当您收到此消息时,可能是一些事情。一些例子:

1.) 只读标记文件

2.) SQL Server 服务帐户对文件的权限不足

3.) 对文件所在文件夹的权限不足。

您在我们的聊天中表示这不是只读的。您还验证了权限看起来像完全访问权限。排除了这三个项目。

从我们的聊天对话中,当您使用 sp_detach_db 正确分离数据库时,您没有遇到此问题 - 这实际上更改了文件的权限,这让我建议尝试以管理员身份运行 SSMS。

为什么?好吧,这篇文章对这里的一些模拟问题进行了更详细的介绍 - 但我的理解是:

1.) 当您停止 SQL Server 服务并移动文件时。该文件的所有者是创建它的服务帐户。

2.) 当您分离数据库时 - 您可能会注意到权限更改。所有者已基本更改,并且该文件与该 SQL Server 服务帐户的关联方式并不相同。

3.) 因此,当您尝试附加时它会起作用,因为可以分配权限,因为文件的安全性允许它..

但是,如果您只是停止该服务,则安全性并未改变,并且如果您启用了 UAC,则无法附加该服务,除非您模拟管理访问权限。

我可能在这里让文件所有权和访问变得更加混乱,但我分享的文章可能做得更好:-)

但一个小小的道德是 - 下次分离 ;-) 或者只是准备在以各种方式与操作系统交互时不时以管理员身份运行 SSMS。