Recentemente, atualizei o LocalDB da versão 13 para 14 usando o instalador do SQL Server Express e esta instrução . Após a instalação, parei a instância padrão existente (MSSQLLOCALDB) da versão 13 e criei uma nova, que usava automaticamente o mecanismo do servidor v14.0.1000.
Costumo usar o LocalDB para testes de Integração de Banco de Dados, ou seja, em meus testes de xunit, crio um banco de dados (temporário) que é excluído quando o teste termina. Desde a nova versão, infelizmente todos os meus testes falham por causa da seguinte mensagem de erro:
CREATE FILE encontrou o erro 5 do sistema operacional (Acesso negado.) ao tentar abrir ou criar o arquivo físico 'C:\Users\kepflDBd0811493e18b46febf980ffb8029482a.mdf'
O estranho é que o caminho de destino para o arquivo mdf está incorreto, falta uma barra invertida entre C:\Users\kepfl e DBd0811493e18b46febf980ffb8029482a.mdf (que é o nome aleatório do banco de dados para um único teste). Os bancos de dados são criados através do comando simples CREATE DATABASE [databaseName]
- nada de especial aqui.
No SSMS, vejo que os locais de destino para dados, log e backup são os seguintes:
No entanto, quando tento atualizar o local, recebo outra mensagem de erro:
Como posso atualizar os locais padrão para que o LocalDB possa criar bancos de dados novamente? É óbvio que o LocalDB não combina corretamente o diretório de localização padrão e o nome do arquivo de banco de dados - existe uma entrada de registro que eu possa editar? Ou qualquer outra coisa?
Atualização após a resposta de Doug e o comentário de sepupic
De acordo com esta pergunta do Stackoverflow , o local padrão também deve ser alterável por meio do registro. No entanto, se eu tentar encontrar as chaves correspondentes "DefaultData", "DefaultLog" e "BackupDirectory", não consigo encontrá-las no meu registro. O SQL Server v14 renomeou essas chaves de registro ou moveu essas informações para fora do registro?
ATUALIZAR
A partir de CU 6 para SQL Server 2017, esse bug foi corrigido. Agora é possível executar o seguinte com sucesso:
O problema e o fato de ser corrigido no CU6 estão documentados no seguinte artigo da KB:
CORREÇÃO: erro "Acesso negado" ao tentar criar um banco de dados no SQL Server 2017 Express LocalDB
Para obter a atualização cumulativa, vá para a página a seguir e pegue a versão superior (ou seja, a mais recente), que pode ser mais recente que a CU6, dependendo de quando você vir isso:
Versões de compilação do SQL Server 2017
INFORMAÇÕES ABAIXO OBSOLETAS NO SQL SERVER 2017 CU6 (lançado em 2018-04-17)
A falta de uma barra invertida no nome de caminho + arquivo combinado parece ser um bug com o SQL Server 2017. Acabei de me deparar com isso. Eu até tentei editar o Registro para adicionar um
DefaultData
valor de string para C:\Users\MyAccountName\ em ambas as chaves a seguir (os 3 caminhos padrão não estão em nenhuma das chaves de registro LocalDB que examinei):E sim, eu desliguei e reiniciei a instância LocalDB em ambas as tentativas.
No entanto, não estou convencido de que não ser capaz de alterar os caminhos padrão seja um bug, pois pode ser apenas uma documentação ruim e um tratamento de erros ruim combinados. Digo isso porque acabei de tentar editar os locais padrão para o SQL Server LocalDB versões 2014, 2016 e 2017, e todos resultaram exatamente no mesmo erro, o que por si só é estranho por ser de
RegCreateKeyEx()
, que deve estar lidando com o Registro e não o sistema de arquivos.Não poder alterar o caminho é lamentável devido à falta de barra invertida ao criar um novo banco de dados sem especificar os arquivos a serem usados. No entanto, consegui criar um novo banco de dados usando a
CREATE DATABASE
sintaxe completa da seguinte forma:Eu me deparei com o mesmo problema e encontrei uma solução alternativa que não deve ter desvantagens claras (se eu estiver esquecendo alguma coisa, corrija-me) . É baseado na resposta do Solomons, mas sem a necessidade de especificar o caminho absoluto para os arquivos do banco de dados diretamente.
Ele usa sql dinâmico e não é exatamente bonito, mas faz o trabalho até que haja uma correção oficial para o problema.
Estou enfrentando esse problema também. A única solução que encontrei seria conceder o acesso de gravação
c:\Users\
a Todos (ou algo parecido) e deixá-lo criar os arquivos mdf onde quiser.Obrigado pela sua explicação concisa deste problema. Eu me deparei com este mesmo problema ontem. Ainda não encontrei uma solução permanente, mas aqui está minha solução atual.
Estou usando a função Database.EnsureCreated() para criar o banco de dados.
Defina a cadeia de conexão para incluir a configuração ' AttachDBFilename= '.
Execute o aplicativo. Vai gerar um erro:
mas ele irá criar o banco de dados.
Depois disso, altere a string de conexão e remova ' AttachDBFilename= '.
Executei o aplicativo novamente sem erros e as tabelas foram criadas.