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 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 devido à seguinte mensagem de erro:
CREATE FILE encontrou o erro do sistema operacional 5 (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 - há 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 essa pergunta do Stackoverflow , os locais padrão também devem ser alteráveis 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 do registro ou moveu essas informações para fora do registro?
Respostas:
ATUALIZAR
No CU 6 para SQL Server 2017, esse bug foi corrigido. Agora é possível executar o seguinte com êxito:
O problema e o fato de ele estar corrigido no CU6 estão documentados no seguinte artigo da Base de Dados de Conhecimento:
CORRECÇÃ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, mais recente), que pode ser mais recente que o CU6, dependendo de quando você vê isso:
Versões de compilação do SQL Server 2017
INFO ABAIXO OBSOLETO NO SQL SERVER 2017 CU6 (Lançado 2018-04-17)
A falta de uma barra invertida no nome do arquivo Path + File combinado parece ser um bug no SQL Server 2017. Acabei de me deparar com ele. Eu até tentei editar o Registro para adicionar uma
DefaultData
string Valor para C: \ Users \ MyAccountName \ nas duas Chaves a seguir (os 3 caminhos padrão não estão em nenhuma das chaves de registro LocalDB que eu procurei):E sim, desliguei e iniciei novamente a instância LocalDB nas duas 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 combinado. Digo isso porque tentei editar os locais padrão para as versões 2014, 2016 e 2017 do SQL Server LocalDB, e todos resultaram no mesmo erro exato, o que por si só é estranho por ser de
RegCreateKeyEx()
, que deveria estar lidando com o Registro e não o sistema de arquivos.Não é possível 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 maneira:fonte
LOG ON
seção daCREATE DATABASE
instrução. Os arquivos LDF parecem ter sido criados, por padrão, no mesmo local que o arquivo MDF. (Nosso caso de uso de LocalDB é principalmente para uso em testes automatizados.)Corri para o mesmo problema e encontrei uma solução alternativa que não deveria ter nenhuma desvantagem clara (se estou esquecendo algo, corrija-me) . É baseado na resposta de Salomão, 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 do problema.
fonte
QUOTENAME
para o 2º param deFORMATMESSAGE
e colocar aspas em torno do caminho do arquivo:FORMATMESSAGE(N'CREATE DATABASE %s ON PRIMARY ( NAME = %s, FILENAME = "%s" )', QUOTENAME(@databaseName), QUOTENAME(@databaseName), @dataFilePath);
. Mas parece funcionar como você o tem agora, então marque +1 nesta abordagem. Ainda é possível codificar o nome ou passar um caminho: quando você não deseja usar aUSERPROFILE
raiz. Mas você pode permitir isso aqui e usar como padrão oInstanceDefaultDataPath
if@Path IS NULL
. :-)Também estou enfrentando esse problema. A única solução alternativa que encontrei seria conceder acesso de gravação
c:\Users\
a Todos (ou algo assim) e permitir que ele criasse os arquivos mdf onde quisesse.fonte
Obrigado pela sua explicação concisa deste problema. Encontrei esse 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 Isso irá gerar um erro:
mas criará o banco de dados.
Depois disso, altere a cadeia de conexão e remova ' AttachDBFilename = '.
Executei o aplicativo novamente sem erros e as tabelas foram criadas.
fonte
CREATE DATABASE [databasename]
contra o LocalDB e essa mesma instrução está causando problemas, pois o LocalDB concatena erroneamente o diretório de locais padrão com o nome do banco de dados gerado aleatoriamente (consulte os parágrafos 3 e 4 da minha pergunta). Preciso de uma maneira de corrigir os locais padrão para que esse problema de concatenação não ocorra.AttachDBFilename
.