DynamoDB 有觸發器嗎?

有。DynamoDB 的觸發器由 DynamoDB Streams 加上 AWS Lambda 組成:流捕獲每一次項目級別的更改,而訂閱了這條流的 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"
  }
}

兩個映象都在記錄裡。PENDINGSHIPPED 這件事在函式內部就能回答,不用回頭去調錶。觸發器裡的一次 GetItem 既要花掉一次讀取,又要和下一次寫入賽跑,所以它可能交給你一個兩個映象都描述不了的第三種狀態。

檢視型別是在你啟用流時選定的,而已經寫下的記錄只攜帶它當時要求的內容。選 KEYS_ONLYNEW_IMAGE,以後就沒有 OldImage 可以拿來做對比了。

Lambda 把這些同樣的記錄放在一個 Records 陣列裡交給你的函式,並加上一個 eventSourceARN 欄位。上面的 awsRegion 之所以讀作 ddblocal,是因為這次執行用的是 DynamoDB Local;針對線上服務時它攜帶的是區域。

觸發器都用來做什麼

經典用途包括:值發生變化時傳送通知、啟動工作流、維護聚合值和計數器,以及把每一次更改複製到持久儲存(比如 S3)以形成永久審計軌跡。如果函式出錯,Lambda 會重試這一批,直到成功或者記錄過期,重試與批次行為都可配置。

值得了解的限制

AWS 建議一條流最多訂閱兩個 Lambda 函式——再多可能導致讀取被限流。觸發器函式應當是短命的;重活要交給非同步工作流,而不是把長邏輯內聯跑在裡面。

深入了解

先從 DynamoDB Streams 指南入手瞭解流模型本身,用運算式構建器來編寫觸發器所響應的那些寫入,然後下載 DynoTable 來觀察餵給流的那些項目更改。

參考資料

最後核實於 2026-07-13,依據上方連結的 AWS 官方文件。

這條流記錄捕獲於 2026-07-28,環境為 DynamoDB Local 3.3.0、@aws-sdk/client-dynamodb 3.1095.0、Node v24.18.0,除縮排外未作任何編輯地照錄。

不必透過主控台就能操作 DynamoDB

一款快速的 DynamoDB 桌面用戶端,可執行 DynamoDB 無法執行的真正 SQL — JOINs、GROUP BY、聚合 — 並支援視覺化編輯與使用你自己的 Bedrock 金鑰的 AI 代理。

30 天免費試用,無需信用卡 — 之後為無時間限制的免費方案。