最近,我使用 SQL Server Express 安装程序和这条指令将 LocalDB 从版本 13 升级到了 14 。安装后,我停止了版本 13 的现有默认实例(MSSQLLOCALDB)并创建了一个新实例,它自动使用 v14.0.1000 服务器引擎。
我经常使用 LocalDB 进行数据库集成测试,即在我的 xunit 测试中,我创建了一个(临时)数据库,该数据库在测试完成时被删除。自新版本以来,不幸的是,由于以下错误消息,我所有的测试都失败了:
CREATE FILE 在尝试打开或创建物理文件“C:\Users\kepflDBd0811493e18b46febf980ffb8029482a.mdf”时遇到操作系统错误 5(访问被拒绝。)
奇怪的是 mdf 文件的目标路径不正确,在C:\Users\kepfl和DBd0811493e18b46febf980ffb8029482a.mdf(这是单个测试的随机数据库名称)之间缺少反斜杠。数据库是通过简单的命令创建的CREATE DATABASE [databaseName]
——这里没什么特别的。
在 SSMS 中,我看到数据、日志和备份的目标位置如下:
但是,当我尝试更新位置时,我收到另一条错误消息:
如何更新默认位置以便 LocalDB 能够再次创建数据库?很明显,LocalDB 没有正确组合默认位置目录和数据库文件名 - 是否有我可以编辑的注册表项?还是别的什么?
在道格的回答和 sepupic 的评论之后更新
根据这个 Stackoverflow question,默认位置也应该可以通过注册表更改。但是,如果我尝试查找相应的键“DefaultData”、“DefaultLog”和“BackupDirectory”,我无法在注册表中找到它们。SQL Server v14 是否重命名了这些注册表项,或者将这些信息移出注册表?
更新
从 SQL Server 2017 的 CU 6 开始,此错误已得到修复。现在可以成功执行以下操作:
该问题以及它已在 CU6 中得到修复的事实记录在以下知识库文章中:
修复:尝试在 SQL Server 2017 Express LocalDB 中创建数据库时出现“访问被拒绝”错误
要获得累积更新,请转到以下页面并获取顶部(即最新)构建,这可能比 CU6 更新,具体取决于您何时看到:
SQL Server 2017 构建版本
以下信息自 SQL SERVER 2017 CU6 起已过时(2018 年 4 月 17 日发布)
组合路径 + 文件名中缺少反斜杠似乎是 SQL Server 2017 的一个错误。我自己也遇到了。我什至尝试编辑注册表以在以下两个键中为C:\Users\MyAccountName\
DefaultData
添加字符串值(3 个默认路径不在我查看的任何 LocalDB 注册表项中):是的,我在两次尝试中都关闭并再次启动了 LocalDB 实例。
但是,我不相信无法更改默认路径是一个错误,因为它可能只是糟糕的文档和糟糕的错误处理相结合。我这样说是因为我刚刚尝试编辑 SQL Server LocalDB 版本 2014、2016 和 2017 的默认位置,并且都导致完全相同的错误,这本身就很奇怪,因为 from
RegCreateKeyEx()
应该处理注册表和不是文件系统。由于在创建新数据库时没有指定要使用的文件时缺少反斜杠,因此无法更改路径是很不幸的。但是,我能够使用完整的
CREATE DATABASE
语法创建一个新的数据库,如下所示:我遇到了同样的问题,并找到了一个不应该有任何明显缺点的解决方法(如果我忘记了什么,请纠正我)。它基于 Solomons 的回答,但无需直接指定数据库文件的绝对路径。
它使用动态 sql,并不完全漂亮,但它可以完成工作,直到问题得到官方修复。
我也面临这个问题。我发现的唯一解决方法是授予
c:\Users\
每个人(或类似的东西)的写访问权限,并让它在任何需要的地方创建 mdf 文件。感谢您对这个问题的简明解释。我昨天遇到了同样的问题。我仍然没有找到永久的解决方案,但这是我目前的解决方法。
我正在使用 Database.EnsureCreated() 函数来创建数据库。
设置连接字符串以包含“ AttachDBFilename= ”设置。
运行应用程序。它会产生一个错误:
但它会创建数据库。
之后,更改连接字符串并删除“ AttachDBFilename= ”。
我再次运行应用程序,没有任何错误,并创建了表。