Sql-Server

LocalDB v14 為 mdf 文件創建錯誤的路徑

  • November 26, 2019

最近,我使用 SQL Server Express 安裝程序和這條指令將 LocalDB 從版本 13 升級到了 14 。安裝後,我停止了版本 13 的現有預設實例(MSSQLLOCALDB)並創建了一個新實例,它自動使用 v14.0.1000 伺服器引擎。

我經常使用 LocalDB 進行數據庫集成測試,即在我的 xunit 測試中,我創建了一個(臨時)數據庫,該數據庫在測試完成時被刪除。自新版本以來,不幸的是,由於以下錯誤消息,我所有的測試都失敗了:

CREATE FILE 在嘗試打開或創建物理文件“C:\Users\kepflDBd0811493e18b46febf980ffb8029482a.mdf”時遇到作業系統錯誤 5(訪問被拒絕。)

奇怪的是 mdf 文件的目標路徑不正確,在C:\Users\kepflDBd0811493e18b46febf980ffb8029482a.mdf(這是單個測試的隨機數據庫名稱)之間缺少反斜杠。數據庫是通過簡單的命令創建的CREATE DATABASE [databaseName]——這裡沒什麼特別的。

在 SSMS 中,我看到數據、日誌和備份的目標位置如下:

LocalDB 目標位置

但是,當我嘗試更新位置時,我收到另一條錯誤消息:

嘗試更新時出現錯誤消息

**如何更新預設位置以便 LocalDB 能夠再次創建數據庫?**很明顯,LocalDB 沒有正確組合預設位置目錄和數據庫文件名 - 是否有我可以編輯的系統資料庫項?還是別的什麼?

在道格的回答和 sepupic 的評論之後更新

根據這個 Stackoverflow question,預設位置也應該可以通過系統資料庫更改。但是,如果我嘗試查找相應的鍵“DefaultData”、“DefaultLog”和“BackupDirectory”,我無法在系統資料庫中找到它們。SQL Server v14 是否重命名了這些系統資料庫項,或者將這些資訊移出系統資料庫?

更新

從 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

引用自:https://dba.stackexchange.com/questions/191393