Recientemente, actualicé LocalDB de la versión 13 a la 14 usando el instalador de SQL Server Express y esta instrucción . Después de la instalación, detuve la instancia predeterminada existente (MSSQLLOCALDB) de la versión 13 y creé una nueva, que utilizaba automáticamente el motor del servidor v14.0.1000.
A menudo uso LocalDB para las pruebas de integración de la base de datos, es decir, en mis pruebas xunit, creo una base de datos (temporal) que se elimina cuando finaliza la prueba. Desde la nueva versión, desafortunadamente todas mis pruebas fallan debido al siguiente mensaje de error:
CREAR ARCHIVO encontró el error 5 del sistema operativo (acceso denegado) al intentar abrir o crear el archivo físico 'C: \ Users \ kepflDBd0811493e18b46febf980ffb8029482a.mdf'
Lo extraño es que la ruta de destino para el archivo mdf es incorrecta, falta una barra invertida entre C: \ Users \ kepfl y DBd0811493e18b46febf980ffb8029482a.mdf (que es el nombre de la base de datos aleatoria para una sola prueba). Las bases de datos se crean mediante el comando simple CREATE DATABASE [databaseName]
, nada especial aquí.
En SSMS, veo que las ubicaciones de destino para datos, registro y copia de seguridad son las siguientes:
Sin embargo, cuando intento actualizar la ubicación, recibo otro mensaje de error:
¿Cómo puedo actualizar las ubicaciones predeterminadas para que LocalDB pueda crear bases de datos nuevamente? Es obvio que LocalDB no combina correctamente el directorio de ubicación predeterminado y el nombre del archivo de la base de datos. ¿Hay alguna entrada de registro que pueda editar? ¿O algo más?
Actualización después de la respuesta de Doug y el comentario de Sepupic
De acuerdo con esta pregunta de Stackoverflow , la ubicación predeterminada también debe ser modificable a través del registro. Sin embargo, si trato de encontrar las claves correspondientes "DefaultData", "DefaultLog" y "BackupDirectory", no puedo encontrarlas en mi registro. ¿SQL Server v14 cambió el nombre de estas claves de registro o eliminó esta información del registro?
Respuestas:
ACTUALIZAR
A partir de CU 6 para SQL Server 2017, este error se ha solucionado. Ahora es posible ejecutar lo siguiente con éxito:
El problema, y el hecho de que se corrige en CU6, se documenta en el siguiente artículo de KB:
REVISIÓN: error "Acceso denegado" cuando intenta crear una base de datos en SQL Server 2017 Express LocalDB
Para obtener la actualización acumulativa, vaya a la página siguiente y tome la compilación superior (es decir, la última), que podría ser más nueva que CU6 dependiendo de cuándo vea esto:
Versiones de compilación de SQL Server 2017
ABAJO INFO OBSOLETO A PARTIR DEL SERVIDOR SQL 2017 CU6 (Lanzado 2018-04-17)
La falta de una barra diagonal inversa en el nombre combinado de Ruta + Archivo parece ser un error con SQL Server 2017. Me encontré con él. Incluso intenté editar el registro para agregar un
DefaultData
valor de cadena para C: \ Users \ MyAccountName \ en las dos claves siguientes (las 3 rutas predeterminadas no están en ninguna de las claves de registro de LocalDB que examiné):Y sí, apagué y volví a iniciar la instancia de LocalDB en ambos intentos.
Sin embargo, no estoy convencido de que no poder cambiar las rutas predeterminadas sea un error, ya que podría ser una mala documentación y un manejo de errores deficiente combinado. Digo esto porque acabo de intentar editar las ubicaciones predeterminadas para las versiones LocalDB de SQL Server 2014, 2016 y 2017, y todo resultó en el mismo error exacto, que en sí mismo es extraño debido a que es
RegCreateKeyEx()
, que debería tratar con el Registro y No es el sistema de archivos.No es posible cambiar la ruta debido a la falta de barra invertida al crear una nueva Base de Datos sin especificar los archivos a usar. Sin embargo, pude crear una nueva Base de Datos usando la
CREATE DATABASE
sintaxis completa de la siguiente manera:fuente
LOG ON
sección de laCREATE DATABASE
declaración. Los archivos LDF parecen haberse creado, de forma predeterminada, en la misma ubicación que el archivo MDF. (Nuestro caso de uso de LocalDb es principalmente para uso en pruebas automatizadas.)Me encontré con el mismo problema y encontré una solución que no debería tener inconvenientes claros (si estoy olvidando algo, corrígeme) . Se basa en la respuesta de Solomons, pero sin la necesidad de especificar la ruta absoluta a los archivos de la base de datos directamente.
Utiliza sql dinámico y no es exactamente bonito, pero hace el trabajo hasta que haya una solución oficial al problema.
fuente
QUOTENAME
al segundo parámetro deFORMATMESSAGE
y poner comillas alrededor de la ruta del archivo:FORMATMESSAGE(N'CREATE DATABASE %s ON PRIMARY ( NAME = %s, FILENAME = "%s" )', QUOTENAME(@databaseName), QUOTENAME(@databaseName), @dataFilePath);
. Pero parece funcionar como lo tiene ahora, por lo que +1 para este enfoque. Todavía hay un caso para codificar el nombre o pasar una ruta: cuando no desea usar laUSERPROFILE
raíz. Pero podría permitir eso aquí y simplemente predeterminarlo aInstanceDefaultDataPath
if@Path IS NULL
. :-)También estoy enfrentando este problema. La única solución que encontré sería otorgar el acceso de escritura
c:\Users\
a Todos (o algo así) y dejar que cree los archivos mdf donde quiera.fuente
Gracias por su concisa explicación de este problema. Me encontré con este mismo problema ayer. Todavía no he encontrado una solución permanente, pero aquí está mi solución actual.
Estoy usando la función Database.EnsureCreated () para crear la base de datos.
Establezca la cadena de conexión para incluir la configuración ' AttachDBFilename = '.
Ejecuta la aplicación. Generará un error:
pero creará la base de datos.
Después de eso, cambie la cadena de conexión y elimine ' AttachDBFilename = '.
Volví a ejecutar la aplicación sin errores y se crearon tablas.
fuente
CREATE DATABASE [databasename]
contra LocalDB y esta misma declaración está causando problemas ya que LocalDB concatena erróneamente el directorio de ubicaciones predeterminado con el nombre de la base de datos generada aleatoriamente (vea los párrafos 3 y 4 de mi pregunta). Necesito una forma de arreglar las ubicaciones predeterminadas para que este problema de concatenación no ocurra.AttachDBFilename
.