2009-03-31 14 views
12

La edición de base de datos de Visual Studio viene con una herramienta, vsdbcmd.exe, que debería permitirle a alguien implementar un archivo .dbschema (que es generado por el proyecto de base de datos en compilación) en una base de datos. Esto se logra mediante la construcción del primer guión, a continuación, ejecutarlo:Implementación de la base de datos (vsdbcmd.exe): se ignoran DatabaseName y DefaultDataPath?

vsdbcmd.exe/a: Implementar/cs: "Data Source = (local); Integrated Security = true; Pooling = false"/dsp: SQL/dd /model:"..\Database.dbschema "/ t: TargetDatabase = TargetDB /manifest:"..\Database.deploymanifest"

que se puede esperar que se pueda implementar la secuencia de comandos a un servidor de base de datos diferente sin problemas. Sin embargo, la ruta completa al archivo .mdf real está codificada en el script, junto con algunas otras referencias al databse original. O no hay una opción para controlar esto, o no puedo encontrarlo.

¿Alguien está usando esto? ¿Cómo se despliega? ¿Debería haber usado un tipo diferente de proyecto de base de datos (recuerdo haber tenido la opción de elegir entre "Proyecto de base de datos" y "Proyecto de servidor", pero no sé si eso importa)?

EDITAR

puedo anular los .sqlcmdvars muy bien, pero esto no resuelve el problema. Este es un extracto del archivo sql generada mediante un comando como el anterior:

GO 
:setvar DatabaseName "TargetDB" 
:setvar DefaultDataPath "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\" 

lo que existe la base de datos destino "TargetDB" se graba correctamente. Sin embargo, unas pocas líneas adicionales:

CREATE DATABASE [$(DatabaseName)] 
ON 
PRIMARY(NAME = [Original], FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\Original.mdf', SIZE = 3072 KB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024 KB) 
LOG ON (NAME = [Original_log], FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\Original_log.ldf', SIZE = 1024 KB, MAXSIZE = 2097152 MB, FILEGROWTH = 10 %) 

donde Original.mdf es el nombre de la base de datos original (es decir, el PP, donde desplegamos durante el desarrollo, y que se encuentra en las propiedades del proyecto del proyecto de base de datos). Aquí es donde falla la implementación, ya sea porque esa ruta exacta puede ser diferente en la máquina de destino o en mi máquina porque esa db ya existe.

Estos valores parecen simplemente codificados en el script generado.

Respuesta

5

Esto puede ser (es) causada cuando se hace un esquema de base de datos Sincronización -> Base de datos del proyecto. (Mi entorno es VS2010 Enterprise RTM).

Las sentencias ALTER DATABASE generadas se generan para reflejar la base de datos fuente sin tener en cuenta ningún valor de sustitución (también incluirá los tamaños iniciales de base de datos, etc.). El problema no aparece en una importación de base de datos inicial.

Editar los archivos que se encuentran bajo ...

esquema Objects \ nivel de base de Objetos \ Almacenamiento \ Archivos de

... y fijarlos para contener las correctas $(DefaultDataPath)$(DatabaseName).mdf/$(DefaultLogPath)$(DatabaseName)_log.ldf valores - o de otro -- según sea apropiado. (Ahora márquelos como "Omitir" en su comparación de esquemas :-P)

Con la "corrección" anterior, mantener los valores externos volverá a funcionar y es el método preferido para administrar dichas propiedades.

Happy coding.

+1

Genial. Aceptaré su respuesta porque creo que habría funcionado, pero no lo he comprobado. Desde entonces, he cambiado de trabajo :) –

+0

El mismo problema, pero no tengo ningún archivo en este directorio. –

1

Según su edición, quizás esto sea útil. https://blogs.msdn.com/gertd/Default.aspx?p=7

variables de Adición

Hasta ahora hemos estado buscando la forma en que funcionan las cosas, ahora es el momento de añadir algunas nuevas variables y ponerlos a trabajar. Un lugar donde las variables son útiles es en el archivo posterior a la implementación que define los archivos: storage.sql. Las variables permitirán el uso para hacer que el entorno de ubicación sea dependiente.

Dentro del archivo de almacenamiento se encuentra algo como esto:

SI NO EXISTE (SELECCIONAR 1 DE dbo.sysfiles WHERE nombre = 'fgdb_data') COMENZAR ALTER DATABASE [$ (nombrebasedatos)] ARCHIVO ADD ( NOMBRE = N'fgdb_data ', NOMBRE DEL ARCHIVO = N'C: \ Archivos de programa \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ DATA \ fgdb_data.NDF, MAXSIZE = 100 MB, FILEGROWTH = 10MB ) PARA grupo de archivos [TABLAS] END

Podríamos parametrizar este modo la unidad y el directorio desgajados través de una variable a:

: unidad setvar " C:" : directorio setvar "archivos de programa \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ DATA"

SI NO EXISTE (SELECCIONAR 1 DE dbo.sysfiles WHERE nombre = 'fgdb_data') frases BEGIN ALTER DATABASE [ $ (nombre de base de datos)] Añadir archivo ( NOMBRE = N'fgdb_data', FILENAME = N '$ (unidad) \ $ (directorio) \ fgdb_data.ndf', MAXSIZE = 100 MB, 10 MB = FILEGROWTH ) PARA grupo de archivos [ TABLAS] END

Ahora que hemos parametrizado el script, a continuación queremos hacer que las variables formen parte del archivo del proyecto, por lo que las definimos en un solo lugar en lugar de dispersarlas en varios lugares a través de: declaraciones setvar.

En este momento estoy empezando a aprender la RDA a mí mismo pero necesito la respuesta a esta a

+0

No funciona. en el archivo .sql generado, se ve que la ruta al archivo .mdf real está codificada, es decir, no está en una variable. Voy a editar mi pregunta. –

+0

Edité mi publicación en función de sus comentarios, todavía estoy aprendiendo la RDA y me gustaría saber cómo funciona esto –

+0

Eso es todo (ver mi edición) - ya existen tales variables por defecto (DatabaseName y DefaultDataPath), pero no * se usan * en un lugar particular en el script, donde se crea el db. –

Cuestiones relacionadas