2012-04-04 20 views
8

Estamos utilizando el Sql Server 2012 SSDT que eliminó la opción de implementación en Visual Studio para los proyectos de base de datos (ahora proyectos sql). Nos gustaría automatizar el paso de publicación como lo hicimos para la implementación, pero no está claro cómo hacerlo. por lo Tha par de preguntas:Sql Project Publish reemplaza Implementación: cómo suprimir el control de versiones y enganchar en tfs build

  1. He añadido el .publish.xml al proyecto (después del primer manual de publicar, comprobando añadir a proyectar). Incluso después de eso, y configurándolo de manera predeterminada, cuando hago doble clic en él, se crea, pero siempre aparece la ventana de configuración, donde tengo que hacer clic en el botón "Publicar" para continuar. ¿Hay alguna configuración que omita este mensaje y use los valores actuales?

  2. Parece que cada publicación genera una versión de la salida sql. ¿Cómo puedo suprimir esto, es decir, sobrescribir el archivo base cada vez?

  3. Y, por último, cualquier indicador para actualizar la compilación para utilizar el nuevo tipo de proyecto y el comando de publicación para las compilaciones automáticas serán apreciados.

Respuesta

4

La mejor manera que he encontrado para automatizar la implementación de proyectos de bases de datos SSDT es usar msbuild. Originalmente estábamos usando VSTSDB y usamos msbuild contra el archivo * .dbproj. Como resultó, los argumentos para implementar archivos sqlproj son exactamente los mismos.

Como la lista de argumentos anterior nos funciona, no cambié a utilizar el estilo de archivo public.xml. Hay bastante documentación para vsbbcmd.exe y msbuild contra dbproj. Yo usaría eso como referencia.

Aquí está la lista de argumentos, y la salida de la ejecución como lo definimos para la ejecución FinalBuilder

[ MSBuild Project [ C:\xx\xxx\xx\xx\MyProject.sqlproj ] ] 
    Configuration : Release 
    OutDir : C:\Builds\1\xxxxx\builddefname\Binaries\Release\ 
    DeployToDatabase : True 
    TargetDatabase : ExistingDatabaseName 
    TargetConnectionString : Data source=.;Integrated Security=SSPI;** 
    Build started 3/23/2012 2:17:08 PM. 
    Deployment script generated to: 
    C:\Builds\1\xxxx\builddefname_FB\Binaries\Release\MyProject.sql 
    Dropping FK_at_lusys_assetCategory_at_lusys_image... 
    Creating FK_dcb28374eeabe8e715038984419... 
    Creating FK_d82897e4acd966d4b136c242cef... 
    Checking existing data against newly created constraints 
    Update complete. 
    Done Building Project "C:\xxx\xxxxxxx\xxxxxxxxx\MyProject.sqlproj" (Deploy target(s)). 
    Build succeeded. 
    0 Warning(s) 
    0 Error(s) 

y la elaboración de la línea de comandos msbuild se parece a esto:

msbuild XXX.sqlproj /target:Deploy /p:Configuration=xxx;OutDir=xxx;DeployToDatabase=True;TargetDatabase=xxxx;TargetConnectionString="xxxxx";AlwaysCreateNewDatabase=True 
7

Cómo restaurar la opción Implementar :(solo Visual Studio 2010/2012 - esto ya no es compatible con Visual Studio 2013)

La opción Implementar aún está presente, pero por alguna razón no está disponible en los menús. (Maldito equipo de Visual Studio!) He trabajado en todo esto añadiendo la opción Implementar en una de las barras de herramientas de la siguiente manera:

  1. clic en la flecha en el lado derecho de la barra de herramientas.
  2. Haga clic en "Agregar o quitar botones", luego Personalizar.
  3. En el cuadro de diálogo Personalizar, haga clic en Agregar comando.
  4. Seleccione la categoría "Generar", luego seleccione el comando "Implementar selección".
  5. Después de guardar su selección, aparecerá la opción "Implementar [nombre del proyecto]" en la barra de herramientas. Deberá seleccionar su proyecto en el Explorador de soluciones para que el botón se habilite.

Tenga en cuenta que la configuración de implementación es diferente de la configuración de publicación. La configuración de implementación se configura en las propiedades del proyecto en la pestaña Depurar.


para responder a sus preguntas acerca de la opción de publicación:

1) Cómo utilizar una específica publicar archivos de forma predeterminada y evitar los molestos pronta

No creo que hay una manera alrededor de esto

2) Como publicar la base de datos, no sólo los cambios

Abra el archivo de .publish.xml en un editor de texto y añadir <AlwaysCreateNewDatabase>true</AlwaysCreateNewDatabase>.

Por ejemplo:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <TargetDatabaseName>MyDatabase</TargetDatabaseName> 
    <DeployScriptFileName>MyDatabaseProject.sql</DeployScriptFileName> 
    <TargetConnectionString>Data Source=localhost\SQL2012;Integrated Security=True;Pooling=False</TargetConnectionString> 
    <PublishDependentProjects>False</PublishDependentProjects> 
    <ProfileVersionNumber>1</ProfileVersionNumber> 
    <AlwaysCreateNewDatabase>true</AlwaysCreateNewDatabase> 
    </PropertyGroup> 
</Project> 

sintaxis 3) de línea de comandos para automatizado construye

En primer lugar construir su proyecto con msbuild como lo haría normalmente para que el archivo .dacpac se crea en la papelera .

A continuación, utilice sqlpackage.exe publicar usando su archivo .publish.xml:

C:\Program Files\Microsoft Visual Studio 10.0\Microsoft SQL Server Data Tools\sqlpackage.exe /Action:Publish /SourceFile:C:\[path to my project]\bin\Debug\MyDatabaseProject.dacpac /Profile:C:\[path to my project]\MyDatabaseProject.publish.xml

Recuerde que la ruta a sqlpackage.exe puede ser diferente.

4

Un poco tarde para la fiesta, lo admito, pero tal vez esto ayudará a otros que tropiecen con esta discusión. Actualmente, mi compañía se está moviendo a VS2012 y tenemos los tres problemas de la misma manera que Keith. He encontrado soluciones para # 1 y # 2.

Para el n. ° 1, utilizo AutoHotKey para controlar la existencia de la ventana de publicación, y hago clic automáticamente en el botón "Crear secuencia de comandos". Por supuesto, puede hacer que el script haga clic automáticamente en el botón "Publicar". En este ejemplo, si el perfil de publicación no es "XYZ" (siempre prefiero la intervención manual para las implementaciones del servidor de producción), continúe y envíe un Alt + G para generar el script.

#Persistent 
SetTimer, ClosePopups, 5000 

return 

ClosePopups: 
if WinExist("Publish Database ") 
{ 
    WinActivate, Publish Database 
    WinGetTitle, TitleText, A 
    If not TitleText = "Publish Database XYZ.publish.xml" { 
     Send, !G 
    } 
} 
return 

Para # 2, cada vez que se publique incrementa el nombre de archivo con un sufijo número y nos encontramos con un montón de archivos en nuestra carpeta de implementación. Acabo de utilizar eventos de pre-construcción para limpiar los archivos .sql y .txt antes de la construcción:

if exist "$(ProjectDir)$(OutputPath)*.publish.sql" del $(ProjectDir)$(OutputPath)*.publish.sql 
if exist "$(ProjectDir)$(OutputPath)*.txt" del $(ProjectDir)$(OutputPath)*.txt 
+0

añadiendo realidad comillas para del comando, así se ahorrará mucho tiempo: (Si ningún espacio en la ruta) si existe "$ (ProjectDir) $ (OutputPath) *. Publish.sql" del "$ (ProjectDir) $ (OutputPath) *. Publish.sql" si existe "$ (ProjectDir) $ (OutputPath) *. Txt "del" $ (ProjectDir) $ (OutputPath) *. txt " –

Cuestiones relacionadas