如何使用Azure Function out绑定更新Azure存储表中的行

juzqafwq  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(229)

我正在使用Azure函数来处理存储在Azure存储表中的数据。Azure函数是在PowerShell中编写的,由计时器触发,每分钟运行一次。每次运行时,它将获取前10个未处理的行,处理这些行中的每一行,然后通过将字段“已处理”设置为true将该行标记为已处理。但是,似乎通过使用输出绑定我不能更新一行。
我尝试使用以下配置和代码更新行。
函数绑定:

{
      "tableName": "tobeprocessed",
      "connection": "ProcessStorage",
      "name": "InProcessStorageTableBinding",
      "type": "table",
      "direction": "in"
    },
    {
      "tableName": "tobeprocessed",
      "connection": "ProcessStorage",
      "name": "OutProcessStorageTableBinding",
      "type": "table",
      "direction": "out"
    }

功能代码:

param($Timer, $InProcessStorageTableBinding)

# Get first ten unprocessed rows
$InProcessStorageTableBinding | Where-Object { $_.Processed -eq $false } | Select-Object -First 10 | ForEach-Object {

    # Logic for processing the values in the row
    # left out for the sake of brevity

    # Update the row
    $_.Processed = $true
    Push-OutputBinding -Name OutProcessStorageTableBinding -Value $_
}

在Azure门户上的Azure函数的日志中显示的消息是:
指定的实体已存在。RequestId:da 4224 dd-0002-0071-0671- 70 a732000000时间:2023-04- 16 T14:38:05.4671520Z
在互联网上搜索可能的解决方案时,我发现人们正在使用PowerShell模块AzTable中的Get-AzStorageTableUpdate-AzTableRow来更新Azure存储表中的行。但这样做需要更多的配置(证书、租户和应用ID,等等),因为似乎通过使用Update-AzTableRow我们不能使用out绑定。绑定是Azure Functions的一个很好的功能,因为它在后台处理所有的身份验证和连接设置,所以如果可能的话,我真的更喜欢使用外装订。
更新:正如Peter Bons在下面的回答中指出的,关于Azure Tables output bindings的文档非常清楚地表明,使用绑定是不可能进行更新的。
那么,是否有可能重用由绑定设置的连接(部分),以减少所需的管道,以便能够使用(例如)PowerShell模块AzTable来更新行?
所以我们可以做这样的事情:

$table = Get-AzStorageTable –Connection $InProcessStorageTableBinding.Connection

$cloudTable = $table.CloudTable

$rowToProcess = Get-AzTableRow `
    -table $cloudTable `
    -customFilter <filter to retrieve row>

$rowToProcess.Processed = $true

$rowToProcess | Update-AzTableRow -table $cloudTable
yizd12fk

yizd12fk1#

你的运气恐怕不好。The docs证实你的怀疑:
此输出绑定仅支持在表中创建新实体。如果需要从函数代码更新现有实体,请直接使用Azure Tables SDK。

相关问题