---
{
  "id": "platform.trigger.lifecycle-and-immutable-update",
  "topic": "trigger",
  "title": "Trigger 生命週期與 immutable update",
  "locale": "zh-TW",
  "version": "2026-07-17",
  "summary": "Trigger update 會在同一 transaction 取消舊 row 並建立新的 active row，後續操作必須使用回傳的 triggerId。",
  "content": "User-visible lifecycle 區分 `active`、`paused`、`cancelled`、`deleted`；`firing` 是暫時的 conflict state。`set_enabled(false)` 把符合條件的規則變成 paused，`set_enabled(true)` 恢復 active。cancelled 會停止未來正常 fires，但保留 cancellation history；deleted 是不同的 tombstone，不等於 cancelled。\n\n`update_trigger` 在同一 transaction 採 immutable append：舊 row 以 `system:replaced` 取消，再插入新的 active row。response `triggerId` 與 request ID 不同；新 row 的 `replacesTriggerId` 指回舊 ID，lineage 也可顯示 `replacedByTriggerId`。所有後續操作都必須改用回傳的新 ID。\n\ninput `enabled` 只為 backward compatibility，會被忽略。replacement 一律先 active；若要維持 paused，update 成功後再呼叫 `set_enabled(newTriggerId, false)`。已 cancelled 的 trigger 再 cancel 是 idempotent success，但 deleted row 不得假裝 cancel 成功。firing 或 terminal 狀態的 update/cancel conflict 依 shared runtime contract。cancel 與 deprecated delete 需要 confirmation；update 與 set-enabled 不需要。\n",
  "aliases": [
    "暫停 Trigger",
    "恢復 Trigger",
    "immutable update",
    "新 triggerId",
    "replacesTriggerId",
    "system replaced"
  ],
  "tags": [
    "trigger",
    "lifecycle",
    "replacement"
  ],
  "relatedActions": [
    "arinova.trigger.get_trigger",
    "arinova.trigger.update_trigger",
    "arinova.trigger.set_enabled",
    "arinova.trigger.cancel_trigger",
    "arinova.trigger.delete_trigger"
  ],
  "relatedActionPrefixes": [],
  "url": "https://docs.arinova.ai/zh-tw/kb/trigger/lifecycle-and-immutable-update/"
}
---

User-visible lifecycle 區分 `active`、`paused`、`cancelled`、`deleted`；`firing` 是暫時的 conflict state。`set_enabled(false)` 把符合條件的規則變成 paused，`set_enabled(true)` 恢復 active。cancelled 會停止未來正常 fires，但保留 cancellation history；deleted 是不同的 tombstone，不等於 cancelled。

`update_trigger` 在同一 transaction 採 immutable append：舊 row 以 `system:replaced` 取消，再插入新的 active row。response `triggerId` 與 request ID 不同；新 row 的 `replacesTriggerId` 指回舊 ID，lineage 也可顯示 `replacedByTriggerId`。所有後續操作都必須改用回傳的新 ID。

input `enabled` 只為 backward compatibility，會被忽略。replacement 一律先 active；若要維持 paused，update 成功後再呼叫 `set_enabled(newTriggerId, false)`。已 cancelled 的 trigger 再 cancel 是 idempotent success，但 deleted row 不得假裝 cancel 成功。firing 或 terminal 狀態的 update/cancel conflict 依 shared runtime contract。cancel 與 deprecated delete 需要 confirmation；update 與 set-enabled 不需要。
