微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用计时器触发的 Azure 函数异步执行长时间运行的存储过程

如何解决使用计时器触发的 Azure 函数异步执行长时间运行的存储过程

从 Azure 计时器触发的函数获取正在执行的存储过程时遇到一些问题,并且正在努力找出原因。

我有一堆小型存储过程,它们根据一些逻辑执行一些行更新和插入,这些逻辑使用 Azure 计时器触发函数执行,没有问题,但其中一个行为不端。

存储过程是相当自适应的索引碎片整理从这里:(https://github.com/microsoft/tigertoolbox/tree/master/AdaptiveIndexDefrag)

运行大约需要一分钟,并且计划每天在夜间运行。

这是执行负责执行上述 sproc 的函数代码

    public static class MyFunction {
    [FunctionName("MyFunction")]
    public static async Task Run([TimerTrigger("0 0 0 */1 * * ")] TimerInfo myTimer,ILogger log) {
        await using var conn = new sqlConnection("connection string");

        await using var command = new sqlCommand("do_the_thing",conn) {CommandType = CommandType.StoredProcedure};
        try {
            command.Connection.open();
            var result = await command.ExecuteScalarasync();
            log.Loginformation($"Query result: {result}");
        }
        catch (Exception ex_) {
            log.LogError(ex_,"OH NO!");
        }

        log.Loginformation("Went smoothly");
    }
}

结果值为-1,Azure monitor说查询执行成功,但是查看日志和加载sql server端,存储过程没有运行。

所有其他运行较小 sproc 的函数都重复使用上述代码。我已经使用确切的代码使用测试 sproc 制作了一个测试函数,它工作正常,但是执行索引碎片整理总是失败,但没有给出错误或异常。一切看起来都很好,唯一告诉我 sproc 无法运行的指标是负责执行索引碎片整理 sproc 的 Azure 函数的持续时间计时器,它总是太短,我看到的最大值是 2.5 秒,而它应该超过一分钟。

任何帮助将不胜感激。

解决方法

最后,您尝试传递 @debugMode=1 参数,然后您收到一条消息,指出代码的权限有限,只能从 SqlConnection.InfoMessage 事件中执行某些任务。授予权限后,即可通过定时器触发的 Azure 函数成功执行异步存储过程。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。