DynamoDB 有触发器吗?

有。DynamoDB 的触发器由 DynamoDB Streams 加上 AWS Lambda 组成:流捕获每一次 item 级别的更改,而订阅了这条流的 Lambda 函数会自动作为响应运行。没有 CREATE TRIGGER 语句——触发器代码活在 Lambda 里,在数据库之外。

触发器是怎么工作的

你在表上启用 DynamoDB Streams,然后把流的 ARN 关联到一个 Lambda 函数。每一次创建、更新和删除都会被捕获成一条流记录;Lambda 服务每秒轮询这条流四次,并用一批批新记录同步调用你的函数。你也可以过滤事件,让函数只为你关心的那些更改运行。

函数实际收到的是什么

我们用 StreamViewType: NEW_AND_OLD_IMAGES 启用了一条流,写入一个订单、改了它的状态、再删除它,然后用 GetRecords 把分片读了回来。出来了三条记录:INSERTMODIFYREMOVE。下面是中间那一条,原样照录:

{
  "eventID": "77dabd57-20e1-4827-83e9-0fa20153adb0",
  "eventName": "MODIFY",
  "eventVersion": "1.1",
  "eventSource": "aws:dynamodb",
  "awsRegion": "ddblocal",
  "dynamodb": {
    "ApproximateCreationDateTime": 1785266820,
    "Keys": {"pk": {"S": "ORDER#1"}},
    "NewImage": {
      "total": {"N": "42"},
      "pk": {"S": "ORDER#1"},
      "status": {"S": "SHIPPED"}
    },
    "OldImage": {
      "total": {"N": "42"},
      "pk": {"S": "ORDER#1"},
      "status": {"S": "PENDING"}
    },
    "SequenceNumber": "000000000000000019180",
    "SizeBytes": 67,
    "StreamViewType": "NEW_AND_OLD_IMAGES"
  }
}

两条 image 都在记录里。PENDINGSHIPPED 这个问题可以在函数内部回答,不必再回调表。触发器里的 GetItem 既费一次读,又和下一次写入竞态,所以可能递给你一个两条 image 都描述不了的第三状态。

视图类型在启用流时选定,已经写出的记录只携带当时要求的内容。选了 KEYS_ONLYNEW_IMAGE,后面就没有 OldImage 可做 diff。

Lambda 把同样的记录放进 Records 数组交给你的函数,并加上 eventSourceARN 字段。上面的 awsRegion 读作 ddblocal,是因为这次运行用的是 DynamoDB Local;对着正式服务时会带上 Region。

触发器都用来做什么

典型用途包括:值变化时发通知、启动工作流、维护聚合与计数器,以及把每次更改复制到 S3 这类耐久存储做永久审计轨迹。如果函数出错,Lambda 会重试该批次,直到成功或记录过期;重试与批处理行为可配置。

值得了解的限制

AWS 建议一条流最多订阅两个 Lambda 函数——更多可能造成读限流。触发器函数应短命;重活应交给异步工作流,而不是在函数里跑长逻辑。

深入了解

DynamoDB Streams 指南 了解流模型本身,用表达式构建器 写出触发器会响应的写入,并下载 DynoTable 观察流入你的流的 item 变更。

参考资料

最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。

该流记录于 2026-07-28 在 Node v24.18.0 上用 @aws-sdk/client-dynamodb 3.1095.0 对 DynamoDB Local 3.3.0 捕获,除缩进外未做改动。

无需控制台即可使用 DynamoDB

一款快速的 DynamoDB 桌面客户端,可运行 DynamoDB 无法执行的真正 SQL——JOINs、GROUP BY、聚合——并支持可视化编辑和运行在你自己的 Bedrock 密钥上的 AI agent。

30 天免费试用,无需信用卡 — 之后为无时间限制的免费版。