LocalDB v14 為 mdf 文件創建錯誤的路徑
最近,我使用 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 開始,此錯誤已得到修復。現在可以成功執行以下操作:
CREATE DATABASE [CreateDatabaseTest]; DROP DATABASE [CreateDatabaseTest];
該問題以及它已在 CU6 中得到修復的事實記錄在以下知識庫文章中:
修復:嘗試在 SQL Server 2017 Express LocalDB 中創建數據庫時出現“訪問被拒絕”錯誤
要獲得累積更新,請轉到以下頁面並獲取頂部(即最新)版本,根據您看到此內容的時間,它可能比 CU6 更新:
以下資訊自 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 的預設位置,並且都導致完全相同的錯誤,這本身就很奇怪,因為 from
RegCreateKeyEx()
應該處理系統資料庫和不是文件系統。由於在創建新數據庫時沒有指定要使用的文件時缺少反斜杠,因此無法更改路徑是很不幸的。但是,我能夠使用完整的
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