LocalDB v14 สร้างเส้นทางที่ผิดสำหรับไฟล์ mdf


34

เมื่อเร็ว ๆ นี้ฉันอัพเกรด LocalDB จากรุ่น 13 เป็น 14 โดยใช้โปรแกรมติดตั้ง SQL Server Express และคำสั่งนี้ หลังจากการติดตั้งฉันหยุดอินสแตนซ์เริ่มต้นที่มีอยู่ (MSSQLLOCALDB) เวอร์ชัน 13 และสร้างขึ้นใหม่ซึ่งใช้เอ็นจิ้นเซิร์ฟเวอร์ v14.0.1000 โดยอัตโนมัติ

ฉันมักจะใช้การทดสอบ LocalDB for Database Integration เช่นในการทดสอบ xunit ของฉันฉันสร้างฐานข้อมูล (ชั่วคราว) ซึ่งจะถูกลบเมื่อการทดสอบเสร็จสิ้น ตั้งแต่เวอร์ชันใหม่โชคไม่ดีที่การทดสอบทั้งหมดของฉันล้มเหลวเนื่องจากข้อความแสดงข้อผิดพลาดต่อไปนี้:

สร้างไฟล์พบข้อผิดพลาดของระบบปฏิบัติการ 5 (ปฏิเสธการเข้าถึง) ในขณะที่พยายามเปิดหรือสร้างไฟล์ฟิสิคัล 'C: \ Users \ kepflDBd0811493e18b46febf980ffb8029482a.mdf'

สิ่งแปลกคือเส้นทางเป้าหมายสำหรับไฟล์ mdf ไม่ถูกต้องแบ็กสแลชหายไประหว่างC: \ Users \ kepflและDBd0811493e18b46febf980ffb8029482a.mdf (ซึ่งเป็นชื่อฐานข้อมูลแบบสุ่มสำหรับการทดสอบเดี่ยว) ฐานข้อมูลถูกสร้างผ่านคำสั่งง่าย ๆCREATE DATABASE [databaseName]- ไม่มีอะไรพิเศษที่นี่

ใน SSMS ฉันเห็นว่าตำแหน่งที่ตั้งเป้าหมายสำหรับข้อมูลบันทึกและสำรองข้อมูลมีดังต่อไปนี้:

ตำแหน่งเป้าหมาย LocalDB

อย่างไรก็ตามเมื่อฉันพยายามอัปเดตตำแหน่งฉันได้รับข้อความแสดงข้อผิดพลาดอื่น:

ข้อความแสดงข้อผิดพลาดเมื่อพยายามอัปเดต

ฉันจะอัปเดตตำแหน่งเริ่มต้นเพื่อให้ LocalDB สามารถสร้างฐานข้อมูลได้อีกครั้งได้อย่างไร เป็นที่ชัดเจนว่า LocalDB ไม่ถูกต้องรวมไดเรกทอรีที่ตั้งเริ่มต้นและชื่อไฟล์ฐานข้อมูล - มีรายการรีจิสทรีที่ฉันสามารถแก้ไขได้หรือไม่ หรือสิ่งอื่นใด

อัปเดตหลังจากคำตอบของดั๊กและความคิดเห็นของเซพปิค

ตามคำถาม Stackoverflow นี้ตำแหน่งเริ่มต้นควรเปลี่ยนแปลงได้ผ่านรีจิสตรี อย่างไรก็ตามถ้าฉันพยายามค้นหาคีย์ที่เกี่ยวข้อง "DefaultData", "DefaultLog" และ "BackupDirectory" ฉันจะไม่สามารถหาพวกมันได้ในรีจิสตรีของฉัน SQL Server v14 เปลี่ยนชื่อรีจิสตรีคีย์หรือย้ายข้อมูลเหล่านี้ออกจากรีจิสตรีหรือไม่?


FYI ฉันยังไม่สามารถอัปเดตตำแหน่งเริ่มต้นของฐานข้อมูลเมื่อเรียกใช้ SSMS ในโหมดผู้ดูแลระบบ
feO2x

1
โปรดดูการปรับปรุงในคำตอบของฉัน ข้อผิดพลาดนี้ได้รับการแก้ไขตั้งแต่ CU6 วางจำหน่ายในช่วงกลางเดือนเมษายน ..
โซโลมอน Rutzky

คำตอบ:


21

UPDATE

ตั้งแต่ CU 6 สำหรับ SQL Server 2017 ข้อผิดพลาดนี้ได้รับการแก้ไขแล้ว ตอนนี้สามารถดำเนินการดังต่อไปนี้ได้สำเร็จ:

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

ปัญหาและความจริงที่ว่าได้รับการแก้ไขใน CU6 มีการบันทึกไว้ในบทความ KB ต่อไปนี้: การ
แก้ไข: ข้อผิดพลาด "การเข้าถึงถูกปฏิเสธ" เมื่อคุณพยายามสร้างฐานข้อมูลใน SQL Server 2017 Express LocalDB

หากต้องการรับการอัปเดตสะสมโปรดไปที่หน้าต่อไปนี้และสร้างบิวด์ (เช่นล่าสุด) ซึ่งอาจจะใหม่กว่า CU6 ขึ้นอยู่กับว่าคุณเห็นสิ่งนี้เมื่อใด:

เวอร์ชันการสร้าง SQL Server 2017


OBSOLETE INFO ด้านล่างเป็น SQL Server 2017 CU6 (วางจำหน่าย 2018-04-17)

การไม่มีแบ็กสแลชในชื่อ Path + File ที่รวมกันนั้นดูเหมือนว่าจะเป็นข้อผิดพลาดกับ SQL Server 2017 ฉันเพิ่งพบเจอตัวเอง ฉันได้ลองแก้ไข Registry เพื่อเพิ่มDefaultDataค่าสตริงสำหรับC: \ Users \ MyAccountName \ในทั้งสองคีย์ต่อไปนี้ (พา ธ เริ่มต้น 3 รายการไม่ได้อยู่ในรีจิสตรีคีย์ LocalDB ใด ๆ ที่ฉันค้นหา):

  • Computer \ HKEY_CURRENT_USER \ Software \ Microsoft \ Microsoft SQL Server \ UserInstances \ {some-GUID-value} ของเซิร์ฟเวอร์ SQL
  • Computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ MSSQL14E.LOCALDB \ MSSQLServer

และใช่ฉันทำการปิดเครื่องและเริ่มต้นอินสแตนซ์ของ LocalDB อีกครั้งทั้งสองครั้ง

อย่างไรก็ตามฉันไม่มั่นใจว่าจะไม่สามารถเปลี่ยนเส้นทางเริ่มต้นเป็นข้อผิดพลาดเนื่องจากอาจเป็นเพียงเอกสารประกอบที่ไม่ดีและการจัดการข้อผิดพลาดที่ไม่ดีรวมกัน ฉันพูดแบบนี้เพราะฉันเพิ่งลองแก้ไขตำแหน่งเริ่มต้นสำหรับ SQL Server LocalDB เวอร์ชัน 2014, 2016 และ 2017 และทั้งหมดล้วนส่งผลให้เกิดข้อผิดพลาดเหมือนกันซึ่งในตัวมันเองก็แปลกเพราะมาจากRegCreateKeyEx()ที่ควรจัดการกับ Registry และ ไม่ใช่ระบบไฟล์

การไม่สามารถเปลี่ยนพา ธ เป็นเรื่องที่โชคร้ายเนื่องจากไม่มีแบ็กสแลชเมื่อสร้างฐานข้อมูลใหม่โดยไม่ระบุไฟล์ที่จะใช้ อย่างไรก็ตามฉันสามารถสร้างฐานข้อมูลใหม่โดยใช้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

เรากำลังดำเนินการในการตั้งค่าฐานข้อมูลของเราว่าหากเป็นการเชื่อมต่อ LocalDb เราจะระบุเส้นทางของไฟล์ MDF เช่นเดียวกับในการแก้ปัญหาของคุณ แต่ดูเหมือนว่าไม่จำเป็นต้องระบุชื่อของ LDF หรือLOG ONส่วนของCREATE DATABASEคำสั่ง ดูเหมือนว่าไฟล์ LDF จะถูกสร้างขึ้นตามค่าเริ่มต้นในตำแหน่งเดียวกับไฟล์ MDF (กรณีการใช้ LocalDb ของเราส่วนใหญ่ใช้สำหรับการทดสอบอัตโนมัติ)
tgharold

@tgharold โปรดดูการอัปเดตที่ด้านบนสุดของคำตอบของฉัน ข้อผิดพลาดนี้ได้รับการแก้ไขเมื่อเร็ว ๆ นี้ในแพทช์ CU6 ใหม่ :-)
โซโลมอน Rutzky

5

ฉันวิ่งเข้าไปในปัญหาเดียวกันและพบวิธีแก้ปัญหาที่ไม่ควรมีข้อบกพร่องที่ชัดเจนใด ๆ(ถ้าฉันลืมบางสิ่งบางอย่างโปรดแก้ไขฉัน) เป็นไปตามคำตอบของ 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 และไม่ได้สวยอย่างแน่นอน แต่มันจะทำงานจนกว่าจะมีการแก้ไขปัญหาอย่างเป็นทางการ


1
น่าสนใจ มันอาจจะดีกว่าเล็กน้อยที่จะย้ายที่ 2 QUOTENAMEไปที่พระราม 2 และใส่คำพูดสองรอบเส้นทางของไฟล์:FORMATMESSAGE FORMATMESSAGE(N'CREATE DATABASE %s ON PRIMARY ( NAME = %s, FILENAME = "%s" )', QUOTENAME(@databaseName), QUOTENAME(@databaseName), @dataFilePath);แต่ดูเหมือนว่าจะทำงานอย่างที่คุณเป็นอยู่ตอนนี้ดังนั้น +1 สำหรับวิธีการนี้ ยังคงมีกรณีสำหรับการเข้ารหัสฮาร์ดชื่อหรือส่งผ่านในเส้นทาง: เมื่อคุณไม่ต้องการใช้USERPROFILEรูท แต่คุณอาจทำให้ที่นี่และเพิ่งเริ่มต้นไปถ้าInstanceDefaultDataPath @Path IS NULL:-)
โซโลมอน Rutzky

ขอขอบคุณ. ฉันได้แก้ไขคำตอบของคุณด้วยคำแนะนำแล้ว ฉันเห็นด้วยการเข้ารหัสอย่างหนักเส้นทางที่แน่นอนยังคงเป็นทางออกที่ถูกต้อง ในสถานการณ์สมมติของเราเราจะสร้างฐานข้อมูลขึ้นใหม่ในระหว่างการทดสอบอัตโนมัติและฉันต้องทำให้แน่ใจว่ามันจะใช้ได้กับเพื่อนร่วมงานทั้งหมดของฉันและสร้างเซิร์ฟเวอร์โดยไม่ต้องประสานงานทุกคนสร้างโฟลเดอร์ที่เส้นทางเดียวกันบนเครื่องของพวกเขา :-)
Nikolaj Dam Larsen

4

ฉันกำลังเผชิญกับปัญหานี้เช่นกัน วิธีแก้ปัญหาเดียวที่ฉันพบคือให้สิทธิ์การเข้าถึงเพื่อc:\Users\ทุกคน (หรืออะไรทำนองนั้น) และปล่อยให้มันสร้างไฟล์ mdf ทุกที่ที่ต้องการ


1
ขอบคุณสิ่งนี้แก้ไขให้ฉันด้วย! วิธีแก้ปัญหานี้แย่มาก แต่มีเฉพาะในเซิร์ฟเวอร์บิวด์ท้องถิ่นเท่านั้นดังนั้นฉันไม่สนใจสิทธิ์ผู้ใช้เพิ่มเติม
Hannes Sachsenhofer

@ HannesSachsenhofer: ฉันเห็นด้วยมันแย่มาก แต่ฉันถูกสัญญาโดยทีมงาน LocalDB dev พวกเขาจะแก้ไขข้อผิดพลาดนี้ในการแก้ไขด่วน
abatishchev

ให้สิทธิ์การเข้าถึงเพื่อเขียนให้กับทุกคนดูเหมือนจะเป็นวิธีการแก้ปัญหาที่ไม่ดีสำหรับฉัน
ราฟาเอล

@ ราฟาเอล: ทำไม คุณมีผู้ใช้หลายคนในกล่อง dev คุณ? และคนที่คุณไม่ไว้วางใจ
abatishchev

2

ขอบคุณสำหรับคำอธิบายโดยย่อของปัญหานี้ ฉันพบปัญหาเดียวกันนี้เมื่อวานนี้ ฉันยังไม่พบวิธีแก้ไขปัญหาแบบถาวร แต่นี่เป็นวิธีแก้ปัญหาปัจจุบันของฉัน

ฉันใช้ฟังก์ชัน 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

ฉันรันแอปพลิเคชันอีกครั้งโดยไม่มีข้อผิดพลาดและมีการสร้างตาราง


คำถามสองสามข้อ: ก่อนอื่นต้องแน่ใจ - คุณได้รับข้อผิดพลาด (การเข้าถึงถูกปฏิเสธ) ในตอนแรกและสิ่งนี้ได้รับการแก้ไขแล้วใช่ไหม? ที่สอง - SQL Server Management Studio เป็นแอปพลิเคชั่นเดียวที่กล่าวถึงโดย IP และสิ่งนี้ไม่เหมือนกับสิ่งที่คุณทำจากที่นั่น - แอปพลิเคชันใดที่คุณทำทั้งหมดนี้
RDFozz

ขอบคุณสำหรับคำตอบของคุณ แต่มันไม่ได้แก้ปัญหาของฉัน รหัสทดสอบของฉันสร้างฐานข้อมูลใหม่ที่มีความเรียบง่ายCREATE DATABASE [databasename]กับ LocalDB และข้อความนี้ทำให้เกิดปัญหาเนื่องจาก LocalDB เชื่อมโยงไดเรกทอรีตำแหน่งที่ตั้งเริ่มต้นกับชื่อฐานข้อมูลที่สร้างแบบสุ่ม (ดูวรรค 3 และ 4 ของคำถาม) ฉันต้องการวิธีแก้ไขตำแหน่งเริ่มต้นเพื่อที่ว่าปัญหาการต่อข้อมูลนี้จะไม่เกิดขึ้น
feO2x

ขณะนี้ฉันไม่สามารถสร้างฐานข้อมูลผ่านทาง SQL / DDL เลย ไม่สำคัญว่าฉันจะเรียกใช้คำสั่งผ่าน SSMS หรือจากรหัสหรือที่ใดก็ตามเนื่องจาก LocalDB พยายามสร้างฐานข้อมูลในไดเรกทอรีผู้ใช้โดยตรง (ซึ่งผิดอย่างสมบูรณ์ไม่มีไฟล์ใดที่ได้รับอนุญาตให้อยู่ในไดเรกทอรีนี้) .
feO2x

1
AttachDBFilenameคุณอาจจะสะกดผิด
tgharold
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.