LocalDB v14에서 mdf 파일에 대한 잘못된 경로를 만듭니다.


34

최근에 SQL Server Express 설치 관리자와이 지침을 사용하여 LocalDB를 버전 13에서 14로 업그레이드했습니다 . 설치 후 버전 13의 기존 기본 인스턴스 (MSSQLLOCALDB)를 중지하고 v14.0.1000 서버 엔진을 자동으로 사용하는 새 인스턴스를 작성했습니다.

나는 종종 데이터베이스 통합 테스트를 위해 LocalDB를 사용합니다. 즉, xunit 테스트에서 테스트가 끝나면 삭제되는 (임시) 데이터베이스를 만듭니다. 새 버전부터 불행히도 다음과 같은 오류 메시지로 인해 모든 테스트가 실패합니다.

실제 파일 'C : \ Users \ kepflDBd0811493e18b46febf980ffb8029482a.mdf'를 열거 나 만들 때 CREATE FILE에서 운영 체제 오류 5 (액세스가 거부되었습니다.)가 발생했습니다.

이상한 점은 mdf 파일의 대상 경로가 올바르지 않고 C : \ Users \ kepflDBd0811493e18b46febf980ffb8029482a.mdf (단일 테스트의 임의 데이터베이스 이름) 사이에 백 슬래시가 누락 된 것 입니다. 데이터베이스는 간단한 명령을 통해 만들어 CREATE DATABASE [databaseName]집니다. 여기서 특별한 것은 없습니다.

SSMS에서 데이터, 로그 및 백업의 대상 위치는 다음과 같습니다.

LocalDB 대상 위치

그러나 위치를 업데이트하려고하면 다른 오류 메시지가 나타납니다.

업데이트 할 때 오류 메시지

LocalDB가 데이터베이스를 다시 만들 수 있도록 기본 위치를 어떻게 업데이트 할 수 있습니까? LocalDB가 기본 위치 디렉토리와 데이터베이스 파일 이름을 올바르게 결합하지 않는 것이 분명합니다. 편집 할 수있는 레지스트리 항목이 있습니까? 아니면 다른 것?

Doug의 답변과 sepupic의 의견 후 업데이트

이 Stackoverflow question 에 따르면 기본 위치는 레지스트리를 통해 변경할 수도 있습니다. 그러나 해당 키 "DefaultData", "DefaultLog"및 "BackupDirectory"를 찾으려고하면 레지스트리에서 찾을 수 없습니다. SQL Server v14가 이러한 레지스트리 키의 이름을 바 꾸었습니까? 아니면 이러한 정보를 레지스트리에서 옮겼습니까?


참고로, 관리자 모드에서 SSMS를 실행할 때 데이터베이스 기본 위치도 업데이트 할 수 없습니다.
feO2x

1
내 답변에서 업데이트를 참조하십시오. 이 버그는 ... 4 월 중순 출시, CU6의로 수정되었습니다
솔로몬 Rutzky을

답변:


21

최신 정보

SQL Server 2017 용 CU 6부터이 버그가 수정되었습니다. 이제 다음을 성공적으로 실행할 수 있습니다.

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

문제 및 CU6에서 수정 된 사실은 다음 기술 자료 문서에 설명되어 있습니다.
FIX : SQL Server 2017 Express LocalDB에서 데이터베이스를 만들려고하면 "액세스가 거부되었습니다"오류

누적 업데이트를 받으려면 다음 페이지로 이동하여이 시점에 따라 CU6보다 최신 일 수있는 최상위 (즉, 최신) 빌드를 가져 오십시오.

SQL Server 2017 빌드 버전


SQL Server 2017 CU6의 정보 만 사용 가능 (릴리스 2018-04-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의 기본 위치를 편집하려고 시도했는데 모두 동일한 오류가 발생하여 그 자체로 인해 이상합니다.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

데이터베이스 설정에서 LocalDb 연결 인 경우 해결 방법과 마찬가지로 MDF 파일의 경로를 지정하는 접근 방식을 취하고 있습니다. 그러나 LDF의 이름이나 명령문 LOG ON섹션을 지정할 필요는 없습니다 CREATE DATABASE. LDF 파일은 기본적으로 MDF 파일과 동일한 위치에 생성 된 것으로 보입니다. (LocalDb 사용 사례는 주로 자동화 테스트에 사용됩니다.)
tgharold

@tgharold 내 답변 맨 위에있는 업데이트를 참조하십시오. 이 버그는 최근 새로운 CU6 패치에서 수정되었습니다 :-).
Solomon Rutzky

5

나는 같은 문제에 부딪 쳤고 명확한 결점을 가져서는 안되는 해결 방법을 찾았습니다 (뭔가 잊어 버린 경우 수정하십시오) . 솔로몬의 답변을 기반으로하지만 데이터베이스 파일의 절대 경로를 직접 지정할 필요는 없습니다.

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 PARAM에를 FORMATMESSAGE하고 파일 경로의 주위에 따옴표를 넣어 : FORMATMESSAGE(N'CREATE DATABASE %s ON PRIMARY ( NAME = %s, FILENAME = "%s" )', QUOTENAME(@databaseName), QUOTENAME(@databaseName), @dataFilePath);. 그러나 현재와 같이 작동하는 것처럼 보이 므로이 접근법에 +1입니다. USERPROFILE루트 를 사용하지 않으려는 경우 이름을 하드 코딩하거나 경로를 전달하는 경우가 여전히 있습니다 . 그러나 여기서 허용하고 기본값은 InstanceDefaultDataPathif @Path IS NULL입니다. :-)
Solomon Rutzky

고맙습니다. 귀하의 제안으로 답변을 편집했습니다. 절대 경로를 하드 코딩하는 것이 여전히 유효한 솔루션이라는 데 동의합니다. 그러나 우리 시나리오에서는 자동 테스트 중 데이터베이스 만 다시 작성하므로 로컬 컴퓨터에서 동일한 경로에 폴더를 작성하는 모든 사람을 조정하지 않고도 모든 동료 및 빌드 서버에서 작동하는지 확인해야했습니다. :-)
Nikolaj Dam Larsen

4

나는이 문제에 직면하고있다. 내가 찾은 유일한 해결 방법은 c:\Users\Everyone (또는 그와 비슷한 것) 에게 쓰기 권한을 부여하고 원하는 곳에서 mdf 파일을 만들 수있게하는 것입니다.


1
고마워, 이것도 나를 위해 해결되었습니다! 이 해결 방법은 짜증나지만 로컬 빌드 서버에만 있으므로 추가 사용자 권한에 대해서는 신경 쓰지 않습니다.
Hannes Sachsenhofer

@HannesSachsenhofer : 동의합니다. 그러나 LocalDB 개발자 팀은 앞으로 나올 핫픽스 릴리스에서이 버그를 수정하겠다고 약속했습니다.
abatishchev

모든 사람에게 쓰기 권한을 부여하는 것은 나에게 꽤 나쁜 해결책 인 것 같습니다
Raphael

@Raphael : 왜요? 개발자 상자에 여러 명의 사용자가 있습니까? 그리고 당신은 누구를 믿지 않습니까?
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을 통해 데이터베이스를 전혀 만들 수 없습니다. LocalDB는 항상 Users 디렉토리에 데이터베이스를 직접 작성하려고 시도하기 때문에 SSMS를 통해 또는 코드 또는 다른 곳에서 명령문을 실행하더라도 중요하지 않습니다 (이 디렉토리에는 파일이 존재하지 않습니다) .
feO2x

1
철자가 틀렸을 수 AttachDBFilename있습니다.
tgharold
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.