Como publicar un proyecto de Base de datos de Visual Studio a Azure SQL con Azure Pipelines
Tags: azure, azuresql, visualstudio, devops
Published: 2022-08-21 01:08:00

Hola nuevamente, el día de hoy les tengo un proyecto bastante interesante ya que a todos nos ha pasado que se vuelve un caos controlar los cambios que tenemos en nuestras bases de datos, por ejemplo con cada iteración de nuestro proyecto tenemos pequeños cambios a la base de datos, los cuales muy comúnmente los controlamos mediante scripts de SQL, la mayoría de las veces los colocamos dentro del mismo repositorio de nuestra aplicación y en cada deploy a productivo tenemos que ejecutar estos scripts dentro de la base de datos manualmente. Sin embargo, a todos los que hemos realizado esta mala practica nos ha pasado que se nos olvida ejecutar alguno de ellos o no se ejecutan en el orden correcto y cuando todo se integra algo se rompe. 
Bueno para solucionar este problema dentro de Visual Studio podemos crear un proyecto de Base de datos, el cual podemos colocar dentro de un Repo para controlar las versiones y cambios a nuestra Base de datos y todos estos cambios los podemos realizar controlada y automáticamente hacia nuestra base de datos a través de Azure Pipelines. A continuación, te mostraré como realizar esto paso a paso. 
Primero que nada, comenzamos creando nuestro proyecto de base de datos dentro de Visual Studio.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/39totggucrkz82kojg3g.png)

Seleccionamos el proyecto de SQL Server 
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uobbbxxg5u7hxiyqg5vg.png)

Le ponemos un nombre y creamos el proyecto
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3th03l12zytlyfl5j251.png)

Una vez creado el proyecto, la solucion se encuentra en blanco; para ligar nuestra base de datos tenemos varias opciones, una de ellas nos permite importar toda nuestra base (tablas, store procedures, triggers, logins y demás objetos de la db) lo cual es de gran ayuda si es que ya tenemos una base de datos creada. Para esto damos click derecho en el **proyecto -> Import -> Database**.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lnc0f2yitq33dgczofmm.png)

Seleccionamos nuestra base de datos
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8sfhvyr99mpu4om1v0eq.png)

Le damos **Start **para iniciar la importación
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2wq178ntm4zs9q3yi4dh.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7mwwfjxaesp2l5r0wls8.png)

Una vez terminada la importación podemos ver dentro del explorador de soluciones todos los objetos de nuestra DB.
En mi caso la base esta vacía, por lo cual creare 2 tablas (User y Product); esto con la finalidad de demostrar como se realizan los cambios a nuestra base de datos.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e7bauoy8gwhpthkm6me5.png)

Antes de crear los pipelines debemos configurar nuestro proyecto para que se pueda realizar el despliegue hacia Azure SQL, para ello primero configuramos el servidor objetivo como Azure SQL; por alguna extraña razón, aunque importemos de Azure la base de datos Visual Studio mantiene la configuración como SQL Server 2016 lo cual al momento de hacer el despliegue a nuestra base en Azure nos marcará error ya que son incompatibles. Para corregir esto damos click derecho en nuestro proyecto y seleccionamos **Propiedades**.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ndrdljjrpnxb0mzfnqgb.png)

Ahí cambiamos el Target Platform a **Azure SQL**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v7nsdzrnex3skpja67x1.png)

Una vez configurado nuestro Target Platform procedemos a crear el perfil de publicación, este perfil es necesario para realizar el deploy a nuestra base de datos. Para crearlo damos click derecho sobre el proyecto y seleccionamos **Publish…**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ul22f32w8owc3aib4me5.png)

Presionamos el botón **Create Profile**, una vez que el botón se inhiba damos click en cerrar(cancelar).
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/chsaisqmm7lggq2e23c9.png)

Como podemos observar en nuestro proyecto se crea un archivo dentro de la raíz de este, en mi caso se generó el archivo **DBproject.publish.xml**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3rlqv3wb8bpzoas9kqfb.png)

Procedemos a guardar nuestro proyecto dentro de un Repo de Azure, en esta parte podemos observar que el perfil de publicación no lo agrega al control de código, para corregir esto le damos click derecho y seleccionamos: **Git -> Add Ignored File to Source Control…**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m4mbyn87p04jvd7lnqlf.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9f5u1zakwzwun79wx5d7.png)

Después de esto damos nuevamente click derecho sobre el perfil y seleccionamos **Propiedades**; este cambio lo debemos realizar ya que por default el archivo no queda con la opción de copiar al directorio destino.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s46hz0aag99qdq21u7a3.png)

Seleccionamos **Copy Always** en la propiedad de Copy to Output Directory.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j3zxjcxwdvu51spfuf5w.png)

Como siguiente paso creamos un nuevo pipeline dentro de Azure, para esto seleccionamos un nuevo pipeline de Azure.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tst77ban7u53mqes68rm.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sa13ae45y3k8zd729kxw.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8ef3bsmi9rwv8xfv7uhr.png)

A continuación, pongo el archivo YAML para que puedas modificar el código de acuerdo a la configuración de tu proyecto.

```yaml
trigger:
- master

jobs:
- job: Job_1
  displayName: Build DB project.
  pool:
    vmImage: windows-2019

  steps:
  - checkout: self
    clean: true
  - task: VSBuild@1
    displayName: Build solution DBproject
    inputs:
      solution: DBproject/DBproject.sqlproj
      msbuildArgs: /p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation=”$(Build.ArtifactStagingDirectory)\\”
      platform: any cpu
      configuration: release
  - task: CopyFiles@2
    displayName: Copy Dacpac to Build
    inputs:
      SourceFolder: DBproject/bin/Output
      Contents: DBproject.dacpac
      TargetFolder: $(Build.ArtifactStagingDirectory)
  - task: CopyFiles@2
    displayName: Copy Publish profile
    inputs:
      SourceFolder: DBproject
      Contents: DBproject.publish.xml
      TargetFolder: $(Build.ArtifactStagingDirectory)
  - task: PublishBuildArtifacts@1
    displayName: 'Publish Artifact'
    inputs:
      ArtifactName: DBproject
```

Guardamos y ejecutamos nuestro pipeline el cual debe ejecutarse correctamente; continuamos con la creación de nuestro Release para esto damos click al botón crear **New release pipeline**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fth3mdxqpoe1lwjd8goz.png)

Seleccionamos un pipeline vacío. Y en la sección de **Artifacts **seleccionamos como **Source Type: Build**. 
Seleccionamos nuestro proyecto y el Source de nuestro proyecto y Default Version: _Latest _

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i5acfcz3xe93ch3yvj6e.png)

En la sección de **Stages**, damos click en **Jobs **y agregamos una nueva Tarea al Agent, esta será de tipo **Azure SQL Database deployment**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yluey76xyml7h9ik6d2b.png)

Esta tarea la configuramos con los datos de nuestra base de datos e información de nuestro proyecto, deberá de quedar de la siguiente forma:
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wzdfryatq5maruutmsq8.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0z4iine7spo7bl7qa6kp.png)

Ejecutamos nuestro pipeline y esperamos a que termine el deploy, una vez terminado podemos revisar nuestros cambios en la base de datos; en mi caso deben aparecer las dos tablas que agregue. 
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4wr67eaj9luxfblhgyva.png)

Para poder revisar que efectivamente se respeten los cambios a la base de datos sin afectar a lo existente; agregare registros a una de las tablas que cree.  
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f4gx9ekock7uydr3iak5.png)

Creamos una nueva tabla para este ejemplo creare la tabla Store.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ue1pstulg50f9lwxpxox.png)

Ejecutamos nuestros Pipelines y esperamos a que termine el deploy a nuestra base de datos. Revisamos que nuestros cambios estén aplicados y también podemos revisar que no se haya afectado la información que ya teníamos almacenada en nuestra base de datos.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/um8h6ob7htuaf9kcsy37.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e42r7lujl687lgc3putr.png)

Como podemos observar nuestra información esta intacta y solo se aplicaron los cambios, como en este caso crear una tabla nueva. 

Espero que este tutorial de como crear un proyecto de base de datos y hacer el deploy hacia una base de datos en Azure te sea de ayuda. Con esto tenemos controlado y automatizado los cambios que realice el equipo de desarrollo a la base de datos.  

[Mi website](https://victor-canseco.carrd.co/)