无法在作为文件夹安装的卷上创建数据库(错误消息 5123 和 1802)

Cra*_*ein 3 sql-server permissions windows-server

SQL Server 2016 SP1 + CU8 安装在 Windows Server 2016 标准版上。

一段时间内一切正常,我能够创建数据库,直到出于某种我不知道的原因,在我安装的卷上弹出了权限问题。

Msg 5123, Level 16, State 1, Line 1
CREATE FILE encountered operating system error 5(Access is denied.) 
while attempting to open or create the physical file 
'D:\MSSQL13.MSSQLSERVER\MSSQL\Data\UserDB\test.mdf'.
Msg 1802, Level 16, State 4, Line 1
CREATE DATABASE failed. Some file names listed could not be created. 
Check related errors.
Run Code Online (Sandbox Code Playgroud)

文件夹 D:\MSSQL13.MSSQLSERVER\MSSQL\Data\UserDB 实际上是作为文件夹安装在 D:\MSSQL13.MSSQLSERVER\MSSQL\Data 目录中的卷。

在此处输入图片说明

我在谷歌上搜索了几个小时,每个链接都在喋喋不休地谈论所有权和 icacls 以及控制权,但这不是这里的问题。我想清楚的是,在此实例上运行 SQL Server 的服务帐户对这个已安装的卷以及它上面的内容具有完全控制权。

我验证了服务帐户的有效访问权限,它已明确授予完全控制权。

我的怀疑是,它与授予对作为卷而不是磁盘安装的文件夹的权限有关。这是因为在我的测试中,我可以创建一个数据库,其文件位于 D:\ 的根目录中,没有任何问题。D:\ 也是使用相同类型存储的卷。

此外,我自己的用户拥有完全控制权,但是当我尝试创建文件时,我收到此警告。

在此处输入图片说明

奇怪的是,我可以毫无困难地将文件夹添加到 UserDB 文件夹/卷。

如何使这个卷安装为 D:\ 驱动器中的文件夹可写给 MSSQL 帐户?

AMt*_*two 7

由于权限问题,在卷的根目录创建 SQL Server 数据文件是有问题的。我总是建议在卷的根目录上创建一个文件夹,然后将数据文件放在该文件夹中(这也是 Microsoft 的建议)。在驱动器的根目录设置和验证权限并不总是与在文件夹级别设置权限相同。

将卷安装为带字母的驱动器时,这意味着您的数据文件永远不会直接进入D:\,而是进入D:\SomeFolder\. 在您的情况下,您使用的安装点UserDb是卷的根目录。我建议在您的挂载点内创建一个额外的文件夹:D:\...\Data\UserDb\SomeFolder\. 然后,设置权限以确保 SQL Server 服务帐户对SomeFolder目录具有完全控制权。

请注意,来自 Microsoft 的此指南仍然适用:

不要将 SQL Server 安装到挂载点的根目录,始终为所有文件指定一个子目录。这与如何授予权限有关。如果必须将文件放在挂载点的根目录中,则必须手动管理 ACL/权限。

还有这个针对数据库文件的更明确的建议

警告:SQL Server 不支持对 SQL Server 数据库使用装载卷/装载点根目录。

将文件直接放在挂载点的根目录中意味着您必须直接管理每个文件的权限以确保它们是正确的。在创建新数据库(从备份或从模型)的情况下,这可能会出现问题。因此,最佳做法是永远不要将文件放在安装点或驱动器的根目录中。你可以让它工作,但它不受支持,也不是一个好主意。