作为一项平台即服务(PaaS)服务,Azure SQL数据库使开发人员能够在Azure云中部署SQL数据库,而无需管理基础设施。我们使用SQL Server Agent来安排工作,在内部SQL实例中按特定的时间表运行。然而,Azure DB并没有代理功能。
在云中有多种方法来安排作业或批处理。你可以探索Azure自动化系列,使用Azure Logic应用程序和自动化运行簿来执行脚本。
本文主要介绍为Azure SQL数据库调度作业的Azure函数。
Azure函数概述
Azure函数允许你使用较少的编码工作来运行事件触发代码的自动化,而无需在无服务器模式下维护基础设施。你可以在最新的Azure云基础设施资源中开始部署你的代码。
- Azure函数支持C#、F#、JavaScript、node.js、PowerShell等语言。
- 你可以将Azure函数用于任何配置的触发器 - HTTPTrigger、TimerTrigger、QueueTrigger。
- 它支持基于工具(Visual Studio Code、Visual Studio)、应用服务管理(CI/CD管道、容器)、外部管道(Azure管道、GitHub行动)等部署选项。
- 它支持跨平台的本地开发和在Windows和Linux上的托管。
- 我们可以使用Application Insights和Azure Monitor来监控Azure功能。
目前,我们有三种Azure函数的托管计划。
- 消费型。消耗计划是一个完全无服务器的托管选项,支持根据传入的事件动态扩大和缩小资源。Azure会根据函数执行过程中的执行次数、执行时间和使用的内存,向你收取计算资源的费用。它有一个限制,即函数的执行在一个特定的时期后会超时。
- 高级计划。 高级托管计划提供无限制的执行时间,保证60分钟,虚拟网络连接,可预测的价格,避免冷启动和永久热实例。它根据核心秒数和分配给各实例的内存数量来收费。
- 专用的。 在这个计划中,你定义了一组用于执行的计算资源。
你可以在下表中比较这些消费、高级和专用托管。

参考资料。微软文档
配置设置Azure函数应用
要使用Azure函数,我们需要在Azure中部署函数应用。 用你的证书登录到Azure门户,然后搜索 - 功能应用。

点击功能应用页面中的 "创建"。

基本页面配置
在基本页面中,选择你的订阅并创建一个新的资源组。
每个功能应用都需要一个独特的名字。因此,请输入名称。Azure功能名称的后缀为**.azurewebsites.net**

在发布部分,选择代码或docker容器。在运行时栈中,你可以选择.Net、Node.js、Python、Java、PowerShell核心等语言。

对于这篇文章,我们使用3.1版本的.Net语言。 .Net的第6版正在预览中。 
托管。
托管配置需要一个通用的Azure存储账户,用于Blobs、队列和表存储。
设置会自动为存储账户指定一个新名称。但是,你可以选择你的自定义存储账户名称。
选择操作系统为Windows,计划类型为消费,我们在本文前面讨论过。

我们可以配置Azure监控应用洞察力,以监控Azure功能的性能。然而,对于演示的目的,我们不需要它。

在审查+创建页面,审查的配置,并开始功能的应用程序部署。
一旦完成了资源的部署,就可以查看部署的资源及其类型。

点击 "转到资源 "按钮,查看功能应用的状态和URL。 
创建一个功能
在功能、应用程序中,点击功能和创建来部署一个新的功能。

它会打开以下页面。

开发环境。正如前面所讨论的,你可以为Azure函数使用各种部署工具。默认情况下,它使用的是选项--在一个门户中开发。你可以根据你的要求从以下任何一个选项中选择。不过,你需要配置Visual Studio或VS Code来连接到Azure函数。
注:你可以参考超链接 通过使用Visual Studio Code来开发Azure函数。

选择一个模板
模板指定了将调用函数的事件类型。支持的模板有HTTP触发器、定时器触发器、Azure队列存储触发器、Azure Blob存储触发器等。

在本文中,我们使用定时器触发器。一旦我们选择了它,它就会为函数名称和它的时间表打开配置。 
计时器的时间表是CRON格式的。默认情况下,它每5分钟显示一次。 时间表的格式如下。
{秒}{分钟}{小时}{日}{月}{周天}。{日}{月}{周}{日}。
对于这篇文章,我把它设置为每30分钟发生一次。

点击创建,部署该功能,并打开以下仪表盘。

点击 "开发人员"选项中的 "代码+测试"。你会得到一个代码窗口,里面有run.csx文件的示例代码。

在我们继续前进之前,在Azure门户中打开你的Azure SQL数据库仪表板,点击显示连接字符串。 
我们还创建了一个存储过程[TestSP],从视图[SalesLT].[vProductAndDescription]中返回行计数。
Create Procedure TestSP
as
begin
SELECT count(*) as NumberofRecords
FROM [SalesLT].[vProductAndDescription]
end
Exec TestSP
记下连接字符串,并输入连接到Azure SQL数据库的密码。

现在,回到Azure函数代码页面,用下面的代码替换。这段代码运行存储过程[TestSP],并在函数输出控制台显示结果。
using System;
using System.Data.SqlClient;
public static void Run(TimerInfo myTimer, ILogger log)
{
string SqlConnectionString ="place your connection string;";
SqlConnection conn = new SqlConnection(SqlConnectionString);
conn.Open();
SqlCommand command = new SqlCommand("TestSP", conn);
command.CommandType = System.Data.CommandType.StoredProcedure;
using (SqlDataReader reader = command.ExecuteReader())
{
if (reader.Read())
{
log.LogInformation($"Successfully Executed Azure Function at:
{DateTime.Now}");
log.LogInformation($"Row count processed: "+
reader.GetInt32(0).ToString());
}
}
conn.Close();
}

单击 "保存"。

要测试Azure函数,请点击测试/运行。如果我们有任何测试HTTP请求的参数,我们可以在这里指定它们。在我们的案例中,我们使用了一个定时器触发器。因此,直接点击底部的运行。

正如下面所强调的,它返回的行数是1746,正如我的样本存储过程所预期的那样。这一次我们做了手动执行。但是,如果你不禁用该功能,它将按照我们的CRON计划每30分钟自动执行一次。

Azure函数执行监控
点击Azure函数控制台中的Monitor,在这里,你可以看到调用情况和日志。仪表板显示了过去30天内函数执行成功和失败的情况,你也可以在表格中记下执行时间。
如果你启用了应用洞察力,你也可以从这里运行应用洞察力中的查询。

集成
集成选项卡给出了Azure函数执行的图形化工作流程。例如,在我们的演示中,我们有一个定时器触发器,可以调用Azure函数。计时器触发器不需要用户输入,而且我们也没有配置任何特定的输出格式。
如下图所示,我们有一个名为 myTimer 的定时器触发器,调用Azure函数AzureSQLTrigger。 如果你有一个复杂的Azure函数,有多个输入、输出或触发器,那么将函数的执行过程可视化是很好的。

你可以点击定时器来查看CRON时间表,或者在需要时进行编辑。

Azure函数应用程序的仪表板图形
Azure函数应用程序给出了函数执行的几个指标的图形视图。这些图表显示了配置的Azure函数的总执行数、成功执行数和失败执行数。

总结
本文探讨了Azure函数用于在类似于SQL Server代理的特定时间表上调度查询执行。Azure函数是基于事件的无服务器选项。因此,你可以根据你在Azure SQL数据库上运行查询的要求来配置事件和函数。