Ejercicio: Implementación de una base de datos SQL en Azure SQL Database

Completado

En la unidad anterior, ha escrito una aplicación de funciones en Azure en la que se pasa cada fotografía cargada a un contenedor de blobs al servicio Custom Vision para determinar si contiene un oso polar. La única salida de la aplicación de funciones ha sido la de un registro en la que se muestra el veredicto representado por el servicio Custom Vision, así como el identificador y la ubicación de la cámara que ha tomado la fotografía.

Ahora, usará Azure SQL Database para crear una base de datos SQL y modificará la aplicación de funciones para escribir en la base de datos. La instancia de SQL Database establece el escenario para visualizar los avistamientos de osos polares en Power BI, que extrae información de la base de datos.

Creación de una base de datos SQL

Para empezar, usará Azure Cloud Shell a fin de crear una base de datos SQL en Azure SQL Database. La base de datos recopila la salida de la aplicación de funciones que ha implementado. Más adelante, conectará la instancia de SQL Database a Power BI para mostrar dónde capturan las cámaras fotografías de osos polares.

  1. En el explorador, vaya al Portal de Azure. En los controles globales, seleccione Azure Cloud Shell.

    Screenshot of the global controls in the Azure portal with the Azure Cloud Shell icon highlighted.

    Apertura de Azure Cloud Shell

    También puede abrir Cloud Shell si va a https://shell.azure.com en una ventana independiente del explorador.

  2. Ejecute el código siguiente para crear valores para el servidor de la instancia de SQL Database, el nombre de usuario y la contraseña de administrador, y el nombre de la base de datos. Reemplace <server-name>, <admin-username>, <admin-password> y <database-name> en el ejemplo de código por valores propios.

    Al elegir los valores, tenga en cuenta las restricciones siguientes:

    • SERVER_NAME debe ser único en Azure. En el nombre del servidor solo se pueden usar letras minúsculas, números y guiones. El primer carácter y el último del nombre no pueden ser guiones.
    • ADMIN_USERNAME no puede ser un nombre reservado en SQL Server, como admin o sa. Puede usar el nombre adminuser.
    • ADMIN_PASSWORD debe tener al menos ocho caracteres.
    SERVER_NAME="<server-name>"
    ADMIN_USERNAME="<admin-username>"
    ADMIN_PASSWORD="<admin-password>"
    DATABASE_NAME="<database-name>"
    

    Nota:

    Copie y guarde los valores de nombre de usuario y contraseña de administrador para usarlos más adelante.

  3. En Cloud Shell, ejecute el comando siguiente para crear un servidor de base de datos SQL en el grupo de recursos polar-bear-rg. Para pegar comandos en Cloud Shell, puede presionar Mayús+Insertar.

    az sql server create --name $SERVER_NAME --resource-group polar-bear-rg --location southcentralus --admin-user $ADMIN_USERNAME --admin-password $ADMIN_PASSWORD
    
  4. Cree una base de datos SQL que esté asignada al nivel de servicio S0.

    az sql db create --resource-group polar-bear-rg --server $SERVER_NAME --name $DATABASE_NAME --service-objective S0
    
  5. En Azure Portal, abra el nuevo servidor de SQL Database. Después, en el menú de recursos, en Seguridad, seleccione Redes:

    1. Para que después pueda conectarse a la base de datos desde Power BI Desktop, seleccione Add your client IPv4 address (Agregar la dirección IPv4 de cliente).
    2. Active la casilla Permitir que los servicios y recursos de Azure accedan a este servidor.
    3. Seleccione Guardar. Si se le solicita, seleccione Aceptar.

    Screenshot that highlights networks settings to select for the s q l database server.

    Configuración del servidor de base de datos SQL

  6. A continuación, abra la base de datos. Luego, en el menú de recursos, seleccione Editor de consultasy escriba el nombre de usuario y la contraseña de administrador que ha establecido en el paso 2. Seleccione Aceptar.

  7. Copie el código siguiente y péguelo en la ventana de la consulta. Después, para crear una tabla de base de datos SQL, seleccione Ejecutar para ejecutar el código.

    CREATE TABLE [dbo].[PolarBears]
    (
        [Id] [uniqueidentifier] NOT NULL,
        [CameraId] [nvarchar](16) NULL,
        [Latitude] [real] NULL,
        [Longitude] [real] NULL,
        [Url] [varchar](max) NULL,
        [Timestamp] [datetime] NULL,
        [IsPolarBear] [bit] NULL,
        PRIMARY KEY CLUSTERED ([Id] ASC)
        WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
    )
    ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    
    ALTER TABLE [dbo].[PolarBears] ADD DEFAULT (newid()) FOR [Id]
    GO
    
    ALTER TABLE [dbo].[PolarBears] ADD DEFAULT (getdate()) FOR [Timestamp]
    GO
    
    ALTER TABLE [dbo].[PolarBears] ADD DEFAULT ((0)) FOR [IsPolarBear]
    GO
    
  8. Seleccione la carpeta Tablas para comprobar que se ha creado la tabla dbo.PolarBears y que tiene el esquema siguiente:

    Image that shows the Tables folder above the d b o dot Polar Bears table.

    Tabla dbo.PolarBears

    En la tabla, la IsPolarBear columna se establece en 1 o 0 para indicar si la imagen de una fila contiene un oso polar. Un valor de 1 (true) significa que la imagen muestra un oso polar.

Modificación de la aplicación de funciones

El paso siguiente consiste en modificar la aplicación de funciones que ha creado para escribir la salida en la instancia de SQL Database.

  1. En Azure Portal, vaya a la aplicación de funciones. En el menú de recursos, seleccione Consola en Herramientas de desarrollo.

    • En la consola de la aplicación de funciones, ejecute el código siguiente para instalar el paquete tedious de npm. Puede ignorar los mensajes de advertencia. El paquete tedious proporciona una API que Node.js usa para comunicarse con SQL Server y Azure SQL Database.
    npm install tedious
    
  2. En el menú de recursos, seleccione Funciones y vaya a la función BlobTrigger. Seleccione Código y prueba.

  3. En la línea 5 de la función, agregue el código siguiente. Reemplace DATABASE_SERVER_NAME por el nombre que haya asignado al servidor de base de datos y reemplace DATABASE_NAME por el nombre de la base de datos.

    var databaseUserName = process.env.DATABASE_USER_NAME;
    var databasePassword = process.env.DATABASE_PASSWORD;
    var databaseServer = 'DATABASE_SERVER_NAME.database.windows.net';
    var databaseName = 'DATABASE_NAME';
    

    Nota:

    En el código, no reemplace los marcadores de posición DATABASE_USER_NAME o DATABASE_PASSWORD por otros valores. En un paso posterior creará valores para estos marcadores de posición.

  4. Hacia el final de la función, busque las instrucciones siguientes:

            if (isPolarBear) {
                context.log('POLAR BEAR detected by ' + id + ' at ' + latitude + ', ' + longitude);
            }
            else {
                context.log('Other wildlife detected by ' + id + ' at ' + latitude + ', ' + longitude);
            }
    
            context.done();
        }
        else {
            context.log(err);
            context.done();
    
    

    Reemplace las instrucciones por el código siguiente. Ajuste la sangría del código según sea necesario.

    // Update the database
    var Connection = require('tedious').Connection;
    var Request = require('tedious').Request;
    
    var config =
    {
        authentication:
        {
            type: 'default',
            options:
            {
                userName: databaseUserName,
                password: databasePassword
            }
        },
        server: databaseServer,
        options:
        {
            database: databaseName,
            encrypt: true
        }
    };
    
    var dbConnection = new Connection(config);
    
    dbConnection.on('connect', err => {
        if (!err) {
            var query = "INSERT INTO dbo.PolarBears (CameraId, Latitude, Longitude, URL, Timestamp, IsPolarBear) " +
                "VALUES ('" + id + "', " + latitude + ", " + longitude + ", '" + blobUri + "', GETDATE(), " + (isPolarBear ? "1" : "0") + ")";
    
            var dbRequest = new Request(query, err => {
                // Called when request completes, with or without error
                if (err) {
                    context.log(err);
                }
    
                dbConnection.close();
                context.done();
            });
    
            dbConnection.execSql(dbRequest);
        }
        else {
            context.log('DBConnection failed ' + err);
            context.done();
        }
        }); 
        context.log('dbConnection.connect()');
        dbConnection.connect();
        context.log('after dbConnection.connect()');
    
    

    Estas instrucciones se conectan a la base de datos y ejecutan un comando INSERT para registrar el avistamiento de osos polares más reciente. La fila agregada a la base de datos incluye el identificador, la latitud y la longitud de la cámara que ha tomado la fotografía, la dirección URL del blob que contiene la fotografía, la fecha y hora actuales, y un valor IsPolarBear que indica si la fotografía contiene un oso polar.

    Seleccione Guardar.

  5. En el portal, vuelva a la página de información general de la aplicación de funciones. Agregue dos opciones de configuración de la aplicación a la aplicación de funciones:

    1. En el menú de recursos, seleccione Configuración y después Configuración.
    2. Seleccione Configuración de la aplicación y después Nueva configuración de la aplicación.
    3. En Agregar o editar la configuración de la aplicación, agregue una configuración denominada DATABASE_USER_NAME. Establezca el valor en el nombre de administrador que ha especificado al crear el servidor de base de datos. Seleccione Aceptar.
    4. Repita el paso anterior para agregar una configuración denominada DATABASE_PASSWORD. Establezca el valor en la contraseña que ha especificado al crear el servidor de base de datos. Seleccione Aceptar.
    5. Seleccione Guardar. Si se le solicita, seleccione Continuar.
  6. Vuelva al directorio del proyecto en un símbolo del sistema o una ventana de terminal. Después, ejecute run.js.

    node run.js
    
  7. Deje que run.js se ejecute durante un par de minutos. Después, vuelva a la base de datos en el portal. En el editor de consultas, ejecute este código:

    SELECT * FROM dbo.PolarBears
    
  8. Compruebe que la tabla contiene varias filas que representan las imágenes que se han enviado a Custom Vision para el análisis. Examine la columna IsPolarBear de cada fila. ¿Cuántas de las imágenes analizadas contienen un oso polar?

    Screenshot that shows the rows written to the database by the function app.

    Filas escritas en la base de datos por la aplicación de funciones

  9. Vuelva al símbolo del sistema o a la ventana de terminal, y presione Ctrl+C para detener run.js.

A continuación, usará Power BI para generar una visualización gráfica de los datos más atractiva.