Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
As associações de gatilho do Banco de Dados do Azure para MySQL monitoram a tabela do usuário para alterações (inserções e atualizações) e invocam a função com dados de linha atualizados.
As associações de gatilho do Banco de Dados do Azure para MySQL usam az_func_updated_at e colunam dados para monitorar a tabela do usuário em busca de alterações. Dessa forma, você precisa alterar a estrutura da tabela para permitir o controle de alterações na tabela MySQL antes de usar o suporte ao gatilho. Você pode habilitar o controle de alterações em uma tabela por meio da consulta a seguir. Por exemplo, habilite-o na Products tabela:
ALTER TABLE Products
ADD az_func_updated_at TIMESTAMP DEFAULT
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
A tabela de concessões contém todas as colunas que correspondem à chave primária da tabela de usuário e mais três colunas: az_func_AttemptCount, az_func_LeaseExpirationTimee az_func_SyncCompletedTime. Se qualquer uma das colunas de chave primária tiver o mesmo nome, o resultado será uma mensagem de erro que lista conflitos. Nesse caso, as colunas de chave primária listadas devem ser renomeadas para que o gatilho funcione.
Visão geral da funcionalidade
Quando a função de gatilho é iniciada, ela inicia dois loops separados: o loop de sondagem de alteração e o loop de renovação de concessão. Esses loops são executados continuamente até que a função seja interrompida.
A associação de gatilho do Banco de Dados do Azure para MySQL usa o loop de sondagem para verificar se há alterações. O loop de sondagem dispara a função de usuário quando detecta alterações. Em um nível alto, o loop é semelhante a este exemplo:
while (true) {
1. Get list of changes on table - up to a maximum number controlled by the MySql_Trigger_MaxBatchSize setting
2. Trigger function with list of changes
3. Wait for delay controlled by MySql_Trigger_PollingIntervalMs setting
}
As alterações são processadas na ordem em que são feitas. As alterações mais antigas são processadas primeiro. Considere estes pontos sobre o processamento de alterações:
- Se ocorrerem alterações em várias linhas ao mesmo tempo, a ordem exata na qual elas são enviadas para a função é baseada na ordem crescente da
az_func_updated_atcoluna e das colunas de chave primária. - As alterações são em lotes para uma linha. Se várias alterações ocorrerem em uma linha entre cada iteração do loop, somente a última entrada de alteração existente para essa linha será considerada.
Observação
Atualmente, não há suporte para identidades gerenciadas para conexões entre o Azure Functions e o Banco de Dados do Azure para MySQL.
Exemplo de uso
Mais exemplos para o gatilho do Banco de Dados do Azure para MySQL estão disponíveis no repositório GitHub.
O exemplo refere-se a uma classe Product e a uma tabela de banco de dados correspondente:
namespace AzureMySqlSamples.Common
{
public class Product
{
public int? ProductId { get; set; }
public string Name { get; set; }
public int Cost { get; set; }
public override bool Equals(object obj)
{
if (obj is Product)
{
var that = obj as Product;
return this.ProductId == that.ProductId && this.Name == that.Name && this.Cost == that.Cost;
}
return false;
}
}
DROP TABLE IF EXISTS Products;
CREATE TABLE Products (
ProductId int PRIMARY KEY,
Name varchar(100) NULL,
Cost int NULL
);
Habilite o controle de alterações no banco de dados adicionando uma coluna à tabela:
ALTER TABLE <table name>
ADD COLUMN az_func_updated_at TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
O gatilho do Banco de Dados do Azure para MySQL é associado a IReadOnlyList<MySqlChange<T>>, que lista MySqlChange objetos. Cada objeto tem duas propriedades:
-
Item: o item que foi alterado. O tipo do item deve seguir o esquema de tabela, conforme visto naToDoItemclasse. -
Operation: um valor daMySqlChangeOperationenumeração. O valor possível éUpdatepara inserções e atualizações.
O exemplo a seguir mostra uma função C# que é invocada quando ocorrem alterações na Product tabela:
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.MySql;
using Microsoft.Extensions.Logging;
using AzureMySqlSamples.Common;
namespace AzureMySqlSamples.TriggerBindingSamples
{
private static readonly Action<ILogger, string, Exception> _loggerMessage = LoggerMessage.Define<string>(LogLevel.Information, eventId: new EventId(0, "INFO"), formatString: "{Message}");
[Function(nameof(ProductsTrigger))]
public static void Run(
[MySqlTrigger("Products", "MySqlConnectionString")]
IReadOnlyList<MySqlChange<Product>> changes, FunctionContext context)
{
ILogger logger = context.GetLogger("ProductsTrigger");
// The output is used to inspect the trigger binding parameter in test methods.
foreach (MySqlChange<Product> change in changes)
{
Product product = change.Item;
_loggerMessage(logger, $"Change operation: {change.Operation}", null);
_loggerMessage(logger, $"Product Id: {product.ProductId}, Name: {product.Name}, Cost: {product.Cost}", null);
}
}
}
Exemplo de uso
Mais exemplos para o gatilho do Banco de Dados do Azure para MySQL estão disponíveis no repositório GitHub.
O exemplo refere-se a uma Product classe, uma MySqlChangeProduct classe, uma MySqlChangeOperation enumeração e uma tabela de banco de dados correspondente.
Em um arquivo separado chamado Product.java:
package com.function.Common;
import com.fasterxml.jackson.annotation.JsonProperty;
public class Product {
@JsonProperty("ProductId")
private int ProductId;
@JsonProperty("Name")
private String Name;
@JsonProperty("Cost")
private int Cost;
public Product() {
}
public Product(int productId, String name, int cost) {
ProductId = productId;
Name = name;
Cost = cost;
}
}
Em um arquivo separado chamado MySqlChangeProduct.java:
package com.function.Common;
public class MySqlChangeProduct {
private MySqlChangeOperation Operation;
private Product Item;
public MySqlChangeProduct() {
}
public MySqlChangeProduct(MySqlChangeOperation operation, Product item) {
this.Operation = operation;
this.Item = item;
}
}
Em um arquivo separado chamado MySqlChangeOperation.java:
package com.function.Common;
import com.google.gson.annotations.SerializedName;
public enum MySqlChangeOperation {
@SerializedName("0")
Update
}
DROP TABLE IF EXISTS Products;
CREATE TABLE Products (
ProductId int PRIMARY KEY,
Name varchar(100) NULL,
Cost int NULL
);
Habilite o controle de alterações no banco de dados adicionando a seguinte coluna à tabela:
ALTER TABLE <table name>
ADD COLUMN az_func_updated_at TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
O gatilho do Banco de Dados do Azure para MySQL é associado a MySqlChangeProduct[], que é uma matriz de MySqlChangeProduct objetos. Cada objeto tem duas propriedades:
-
item: o item que foi alterado. O tipo do item deve seguir o esquema de tabela, conforme visto naProductclasse. -
operation: um valor daMySqlChangeOperationenumeração. O valor possível éUpdatepara inserções e atualizações.
O exemplo a seguir mostra uma função Java que é invocada quando ocorrem alterações na Product tabela:
/**
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for
* license information.
*/
package com.function;
import com.microsoft.azure.functions.ExecutionContext;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.mysql.annotation.MySqlTrigger;
import com.function.Common.MySqlChangeProduct;
import com.google.gson.Gson;
import java.util.logging.Level;
public class ProductsTrigger {
@FunctionName("ProductsTrigger")
public void run(
@MySqlTrigger(
name = "changes",
tableName = "Products",
connectionStringSetting = "MySqlConnectionString")
MySqlChangeProduct[] changes,
ExecutionContext context) {
context.getLogger().log(Level.INFO, "MySql Changes: " + new Gson().toJson(changes));
}
}
Exemplo de uso
Mais exemplos para o gatilho do Banco de Dados do Azure para MySQL estão disponíveis no repositório GitHub.
Os exemplos se referem a uma tabela Product de banco de dados:
DROP TABLE IF EXISTS Products;
CREATE TABLE Products (
ProductId int PRIMARY KEY,
Name varchar(100) NULL,
Cost int NULL
);
Habilite o controle de alterações no banco de dados adicionando uma coluna à tabela:
ALTER TABLE <table name>
ADD COLUMN az_func_updated_at TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
O gatilho do Banco de Dados do Azure para MySQL é associado a Product, que lista objetos. Cada objeto tem duas propriedades:
-
item: o item que foi alterado. A estrutura do item segue o esquema da tabela. -
operation: o valor possível éUpdatepara inserções e atualizações.
O exemplo a seguir mostra uma função do PowerShell que é invocada quando ocorrem alterações na Product tabela.
Veja a seguir o exemplo da associação de dados no arquivo function.json:
{
"bindings": [
{
"name": "changes",
"type": "mysqlTrigger",
"direction": "in",
"tableName": "Products",
"connectionStringSetting": "MySqlConnectionString"
}
],
"disabled": false
}
A seção Configuração explica essas propriedades.
O exemplo a seguir é o código do PowerShell de exemplo para a função no arquivo run.ps1:
using namespace System.Net
param($changes)
# The output is used to inspect the trigger binding parameter in test methods.
# Use -Compress to remove new lines and spaces for testing purposes.
$changesJson = $changes | ConvertTo-Json -Compress
Write-Host "MySql Changes: $changesJson"
Exemplo de uso
Mais exemplos para o gatilho do Banco de Dados do Azure para MySQL estão disponíveis no repositório GitHub.
Os exemplos se referem a uma tabela Product de banco de dados:
DROP TABLE IF EXISTS Products;
CREATE TABLE Products (
ProductId int PRIMARY KEY,
Name varchar(100) NULL,
Cost int NULL
);
Habilite o controle de alterações no banco de dados adicionando uma coluna à tabela:
ALTER TABLE <table name>
ADD COLUMN az_func_updated_at TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
O gatilho do Banco de Dados do Azure para MySQL é associado a Changes, que é uma matriz de objetos. Cada objeto tem duas propriedades:
-
item: o item que foi alterado. A estrutura do item segue o esquema da tabela. -
operation: o valor possível éUpdatepara inserções e atualizações.
O exemplo a seguir mostra uma função JavaScript que é invocada quando ocorrem alterações na Product tabela.
Veja a seguir o exemplo da associação de dados no arquivo function.json:
{
"bindings": [
{
"name": "changes",
"type": "mysqlTrigger",
"direction": "in",
"tableName": "Products",
"connectionStringSetting": "MySqlConnectionString",
}
],
"disabled": false
}
A seção Configuração explica essas propriedades.
O exemplo a seguir é um código JavaScript de exemplo para a função no index.js arquivo:
module.exports = async function (context, changes) {
context.log(`MySql Changes: ${JSON.stringify(changes)}`)
}
Exemplo de uso
Mais exemplos para o gatilho do Banco de Dados do Azure para MySQL estão disponíveis no repositório GitHub.
Os exemplos se referem a uma tabela Product de banco de dados:
DROP TABLE IF EXISTS Products;
CREATE TABLE Products (
ProductId int PRIMARY KEY,
Name varchar(100) NULL,
Cost int NULL
);
Habilite o controle de alterações no banco de dados adicionando uma coluna à tabela:
ALTER TABLE <table name>
ADD COLUMN az_func_updated_at TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
Observação
Você deve usar o Azure Functions versão 1.22.0b4 para Python.
O gatilho do Banco de Dados do Azure para MySQL é associado a uma variável nomeada Product, que lista objetos. Cada objeto tem duas propriedades:
-
item: o item que foi alterado. A estrutura do item segue o esquema da tabela. -
operation: o valor possível éUpdatepara inserções e atualizações.
O exemplo a seguir mostra uma função python que é invocada quando ocorrem alterações na Product tabela.
O exemplo a seguir é o código Python de exemplo para o arquivo function_app.py:
import json
import logging
import azure.functions as func
app = func.FunctionApp()
# The function is triggered when a change (insert, update)
# is made to the Products table.
@app.function_name(name="ProductsTrigger")
@app.mysql_trigger(arg_name="products",
table_name="Products",
connection_string_setting="MySqlConnectionString")
def products_trigger(products: str) -> None:
logging.info("MySQL Changes: %s", json.loads(products))
Atributos
| Propriedade de atributo | Descrição |
|---|---|
TableName |
Obrigatórios. O nome da tabela que o gatilho monitora. |
ConnectionStringSetting |
Obrigatórios. O nome de uma configuração de aplicativo que contém a cadeia de conexão do banco de dados que contém a tabela monitorada para alterações. O nome da configuração da cadeia de conexão corresponde à configuração do aplicativo (em local.settings.json para desenvolvimento local) que contém a cadeia de conexão com o Banco de Dados do Azure para MySQL. |
LeasesTableName |
Opcional. O nome da tabela para armazenar concessões. Se não for especificado, o nome será Leases_{FunctionId}_{TableId}. |
Anotações
Na biblioteca de runtime de funções Java, use a @MySQLTrigger anotação em parâmetros cujos valores viriam do Banco de Dados do Azure para MySQL. Essa anotação dá suporte aos seguintes elementos:
| Elemento | Descrição |
|---|---|
name |
Obrigatórios. O nome do parâmetro ao qual o gatilho se associa. |
tableName |
Obrigatórios. O nome da tabela que o gatilho monitora. |
connectionStringSetting |
Obrigatórios. O nome de uma configuração de aplicativo que contém a cadeia de conexão do banco de dados que contém a tabela monitorada para alterações. O nome da configuração da cadeia de conexão corresponde à configuração do aplicativo (em local.settings.json para desenvolvimento local) que contém a cadeia de conexão com o Banco de Dados do Azure para MySQL. |
LeasesTableName |
Opcional. O nome da tabela para armazenar concessões. Se não for especificado, o nome será Leases_{FunctionId}_{TableId}. |
Configuração
A tabela a seguir explica as propriedades de configuração de associação que você definiu no arquivo function.json:
| Propriedade | Descrição |
|---|---|
name |
Obrigatórios. O nome do parâmetro ao qual o gatilho se associa. |
type |
Obrigatórios. Deve ser definido como MysqlTrigger. |
direction |
Obrigatórios. Deve ser definido como in. |
tableName |
Obrigatórios. O nome da tabela que o gatilho monitora. |
connectionStringSetting |
Obrigatórios. O nome de uma configuração de aplicativo que contém a cadeia de conexão do banco de dados que contém a tabela monitorada para alterações. O nome da configuração da cadeia de conexão corresponde à configuração do aplicativo (em local.settings.json para desenvolvimento local) que contém a cadeia de conexão com o Banco de Dados do Azure para MySQL. |
LeasesTableName |
Opcional. O nome da tabela para armazenar concessões. Se não for especificado, o nome será Leases_{FunctionId}_{TableId}. |
Configuração opcional
Você pode definir as seguintes configurações opcionais para o gatilho do Banco de Dados do Azure para MySQL para desenvolvimento local ou para implantações de nuvem.
host. JSON
Esta seção descreve as configurações disponíveis para essa associação na versão 2.x e posterior. As configurações no arquivo host.json se aplicam a todas as funções em uma instância do aplicativo de funções. Para obter mais informações sobre as configurações de aplicativo de funções, consulte host.json referência para o Azure Functions.
| Configuração | Padrão | Descrição |
|---|---|---|
MaxBatchSize |
100 |
O número máximo de alterações processadas com cada iteração do loop de gatilho antes de serem enviadas para a função disparada. |
PollingIntervalMs |
1000 |
O atraso em milissegundos entre o processamento de cada lote de alterações. (1.000 ms é 1 segundo.) |
MaxChangesPerWorker |
1000 |
O limite superior do número de alterações pendentes na tabela de usuários permitidas por trabalho do aplicativo. Se a contagem de alterações exceder esse limite, isso poderá resultar em uma expansão. A configuração se aplica somente a aplicativos de funções do Azure com o dimensionamento controlado por runtime habilitado. |
Exemplo host.json arquivo
Aqui está um exemplo host.json arquivo com as configurações opcionais:
{
"version": "2.0",
"extensions": {
"MySql": {
"MaxBatchSize": 300,
"PollingIntervalMs": 1000,
"MaxChangesPerWorker": 100
}
},
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
}
},
"logLevel": {
"default": "Trace"
}
}
}
local.setting.json
O arquivo local.settings.json armazena configurações e configurações de aplicativo que as ferramentas de desenvolvimento locais usam. As configurações no arquivo local.settings.json são usadas somente ao executar projetos localmente. Ao publicar seu projeto no Azure, adicione também as configurações necessárias às configurações do aplicativo para o aplicativo de funções.
Importante
Como o arquivo local.settings.json pode conter segredos, como cadeias de conexão, você nunca deve armazená-lo em um repositório remoto. As ferramentas que dão suporte ao Azure Functions fornecem maneiras de sincronizar as configurações no arquivo local.settings.json com as configurações do aplicativo no aplicativo de funções no qual o projeto é implantado.
| Configuração | Padrão | Descrição |
|---|---|---|
MySql_Trigger_BatchSize |
100 |
O número máximo de alterações processadas com cada iteração do loop de gatilho antes de serem enviadas para a função disparada. |
MySql_Trigger_PollingIntervalMs |
1000 |
O atraso em milissegundos entre o processamento de cada lote de alterações. (1.000 ms é 1 segundo.) |
MySql_Trigger_MaxChangesPerWorker |
1000 |
O limite superior do número de alterações pendentes na tabela de usuários permitidas por trabalho do aplicativo. Se a contagem de alterações exceder esse limite, isso poderá resultar em uma expansão. A configuração se aplica somente a aplicativos de funções do Azure com o dimensionamento controlado por runtime habilitado. |
Exemplo local.settings.json arquivo
Aqui está um exemplo local.settings.json arquivo com as configurações opcionais:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet",
"MySqlConnectionString": "",
"MySql_Trigger_MaxBatchSize": 300,
"MySql_Trigger_PollingIntervalMs": 1000,
"MySql_Trigger_MaxChangesPerWorker": 100
}
}
Configurar o controle de alterações (obrigatório)
Configurar o controle de alterações para uso com o gatilho do Banco de Dados do Azure para MySQL exige que você adicione uma coluna em uma tabela usando uma função. Você pode concluir essas etapas em qualquer ferramenta MySQL que dê suporte à execução de consultas, incluindo o Visual Studio Code ou o Azure Data Studio.
As associações de gatilho do Banco de Dados do Azure para MySQL usam az_func_updated_at e colunam dados para monitorar a tabela do usuário em busca de alterações. Dessa forma, você precisa alterar a estrutura da tabela para permitir o controle de alterações na tabela MySQL antes de usar o suporte ao gatilho. Você pode habilitar o controle de alterações em uma tabela por meio da consulta a seguir. Por exemplo, habilite-o na Products tabela:
ALTER TABLE Products;
ADD az_func_updated_at
TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
A tabela de concessões contém todas as colunas que correspondem à chave primária da tabela de usuário e mais duas colunas: az_func_AttemptCount e az_func_LeaseExpirationTime. Se qualquer uma das colunas de chave primária tiver o mesmo nome, o resultado será uma mensagem de erro que lista conflitos. Nesse caso, as colunas de chave primária listadas devem ser renomeadas para que o gatilho funcione.
Habilitar a escala controlada por runtime
Opcionalmente, as funções podem ser dimensionadas automaticamente com base na quantidade de alterações pendentes a serem processadas na tabela do usuário. Para permitir que suas funções sejam dimensionadas corretamente no plano Premium quando você estiver usando gatilhos do Banco de Dados do Azure para MySQL, você precisa habilitar o monitoramento de escala de runtime.
No portal do Azure, em seu aplicativo de funções, selecione Configuração.
Na guia Configurações de runtime de função , para Monitoramento de Escala de Runtime, selecione Ativar.
Suporte à repetição
Tentativas de inicialização
Se ocorrer uma exceção durante a inicialização, o runtime do host tentará reiniciar automaticamente o ouvinte de gatilho com uma estratégia de retirada exponencial. Essas tentativas continuam até que o ouvinte seja iniciado com sucesso ou a inicialização seja cancelada.
Repetições de exceção de função
Se ocorrer uma exceção na função de usuário durante o processamento de alterações, o lote de linhas atualmente sendo processadas será repetido novamente em 60 segundos. Outras alterações são processadas normalmente durante esse tempo, mas as linhas no lote que causaram a exceção são ignoradas até que o período de tempo limite se esvaia.
Se a execução da função falhar cinco vezes consecutivas para uma linha específica, essa linha será ignorada para todas as alterações futuras. Como as linhas em um lote não são determinísticas, as linhas em um lote com falha podem acabar em lotes diferentes em invocações subsequentes. Esse comportamento significa que nem todas as linhas no lote com falha são necessariamente ignoradas. Se outras linhas no lote causaram a exceção, as linhas "boas" poderão acabar em um lote diferente que não falha em invocações futuras.