AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 191393
Accepted
feO2x
feO2x
Asked: 2017-11-22 03:55:12 +0800 CST2017-11-22 03:55:12 +0800 CST 2017-11-22 03:55:12 +0800 CST

LocalDB v14 为 mdf 文件创建错误的路径

  • 772

最近,我使用 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 能够再次创建数据库?很明显,LocalDB 没有正确组合默认位置目录和数据库文件名 - 是否有我可以编辑的注册表项?还是别的什么?

在道格的回答和 sepupic 的评论之后更新

根据这个 Stackoverflow question,默认位置也应该可以通过注册表更改。但是,如果我尝试查找相应的键“DefaultData”、“DefaultLog”和“BackupDirectory”,我无法在注册表中找到它们。SQL Server v14 是否重命名了这些注册表项,或者将这些信息移出注册表?

sql-server sql-server-localdb
  • 4 4 个回答
  • 15246 Views

4 个回答

  • Voted
  1. Best Answer
    Solomon Rutzky
    2017-11-27T14:01:31+08:002017-11-27T14:01:31+08:00

    更新

    从 SQL Server 2017 的 CU 6 开始,此错误已得到修复。现在可以成功执行以下操作:

    CREATE DATABASE [CreateDatabaseTest];
    DROP DATABASE [CreateDatabaseTest];
    

    该问题以及它已在 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 注册表项中):

    • 计算机\HKEY_CURRENT_USER\Software\Microsoft\Microsoft SQL Server\UserInstances\{some-GUID-value}
    • 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL14E.LOCALDB\MSSQLServer

    是的,我在两次尝试中都关闭并再次启动了 LocalDB 实例。

    但是,我不相信无法更改默认路径是一个错误,因为它可能只是糟糕的文档和糟糕的错误处理相结合。我这样说是因为我刚刚尝试编辑 SQL Server LocalDB 版本 2014、2016 和 2017 的默认位置,并且都导致完全相同的错误,这本身就很奇怪,因为 fromRegCreateKeyEx()应该处理注册表和不是文件系统。

    由于在创建新数据库时没有指定要使用的文件时缺少反斜杠,因此无法更改路径是很不幸的。但是,我能够使用完整的CREATE DATABASE语法创建一个新的数据库,如下所示:

    CREATE DATABASE [XXXXX]
     CONTAINMENT = NONE
     ON PRIMARY 
    ( NAME = N'XXXXX_sys', FILENAME = N'C:\Users\MyAccountName\XXXXX_sys.mdf',
      SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB ), 
     FILEGROUP [Tables] DEFAULT
    ( NAME = N'XXXXX_data', FILENAME = N'C:\Users\MyAccountName\XXXXX_data.ndf',
      SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
     LOG ON 
    ( NAME = N'XXXXX_log', FILENAME = N'C:\Users\MyAccountName\XXXXX_log.ldf',
      SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
     COLLATE Latin1_General_100_CS_AS_KS_WS_SC;
    GO
    
    • 30
  2. Nikolaj Dam Larsen
    2018-03-08T13:59:44+08:002018-03-08T13:59:44+08:00

    我遇到了同样的问题,并找到了一个不应该有任何明显缺点的解决方法(如果我忘记了什么,请纠正我)。它基于 Solomons 的回答,但无需直接指定数据库文件的绝对路径。

    DECLARE @databaseName NVARCHAR(MAX) = 'MyDatabase'
    
    DECLARE @dataFilePath NVARCHAR(MAX) = CAST(SERVERPROPERTY('InstanceDefaultDataPath') AS NVARCHAR) 
        + FORMATMESSAGE('\%s.mdf', @databaseName)
    
    DECLARE @sql NVARCHAR(MAX) = FORMATMESSAGE(
        'CREATE DATABASE %s ON PRIMARY ( NAME = %s, FILENAME = ''%s'' )', 
        quotename(@databaseName), quotename(@databaseName), @dataFilePath
    )
    
    EXEC (@sql)
    

    它使用动态 sql,并不完全漂亮,但它可以完成工作,直到问题得到官方修复。

    • 5
  3. abatishchev
    2018-02-24T16:42:03+08:002018-02-24T16:42:03+08:00

    我也面临这个问题。我发现的唯一解决方法是授予c:\Users\每个人(或类似的东西)的写访问权限,并让它在任何需要的地方创建 mdf 文件。

    • 4
  4. Doug Abrahamson
    2017-11-22T12:42:45+08:002017-11-22T12:42:45+08:00

    感谢您对这个问题的简明解释。我昨天遇到了同样的问题。我仍然没有找到永久的解决方案,但这是我目前的解决方法。

    我正在使用 Database.EnsureCreated() 函数来创建数据库。

    设置连接字符串以包含“ AttachDBFilename= ”设置。

    Server=(LocalDB)\\MSSQLLocalDB;Database=ExploreCalifornia;AttachDbFilename=.\\ExploreCalifornia.mdf;Trusted_Connection=True;MultipleActiveResultSets=true
    

    运行应用程序。它会产生一个错误:

    无法将文件“.\ExploreCalifornia.mdf”附加为数据库“ExploreCalifornia”。

    但它会创建数据库。

    之后,更改连接字符串并删除“ AttachDBFilename= ”。

     Server=(localdb)\\MSSQLLocalDB;Database=ExploreCalifornia;Trusted_Connection=True;MultipleActiveResultSets=true
    

    我再次运行应用程序,没有任何错误,并创建了表。

    • 3

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve