数据库迁移
# 数据库迁移
迁移是显式命令,不会在 API 启动时偷偷升级。当前源码为 MySQL、PostgreSQL、达梦分别维护迁移脚本,当前 schema 版本为 v48。M5历史与新增v27–v29的实际验证范围见 M5 实施记录。达梦 v13 在锁定开发实例上已通过完整业务回归,生产认证边界见 数据库适配。历史迁移文件的字节保持不变,新版本只追加脚本。
在外层仓库按 快速启动(后端) 配好 APP_DATABASE_DRIVER 和 APP_DATABASE_DSN 后执行:
bash scripts/fago.sh migrate
三种方言的源文件分别位于 fago/fago-server/fago-migrations/mysql/、postgres/、dm/。达梦目录包含 0001_base.sql 至 0048_workflow_management_navigation.sql,不是在运行时把 MySQL SQL 替换成达梦语法。
构建只嵌入所选数据库的脚本和驱动。例如已在本机私有配置中设置达梦连接后:
# 开发运行:选择达梦构建并显式执行迁移。
APP_DATABASE_DRIVER=dm bash scripts/fago.sh migrate
# 发布:只输出当前 OS/架构的一套达梦 API、worker、CLI。
bash scripts/build-go.sh dm
# 发布后的同一个 CLI 内含达梦 SQL,无需再复制另外两种数据库的脚本。
APP_DATABASE_DRIVER=dm .cache/release/fago-cli migrate
FAGO_DATABASE_BUILD 若已设置,必须与 APP_DATABASE_DRIVER 保持一致;构建目标与配置不符会拒绝执行。连接凭证由当前环境 YAML 或环境变量提供,不写入上述命令或提交到仓库。
每次迁移检查版本连续、dirty 标记和 SQL 校验和。重复执行已经成功的版本不会改数据。带数据的旧库按顺序升级,已有账号、口令散列和会话保留。
失败时迁移停在 dirty。先根据错误修复原因,再按该版本的恢复方式处理。禁止直接清除 dirty 标记后继续,否则校验和和已执行的半截 DDL 会对不上。
部分 DDL 无法用一条事务包住。组织树的防环和删除标记,在 MySQL 上由服务在租户锁里保证;PostgreSQL 另外保留对应 CHECK。两库都有版本、状态 CHECK 和同租户复合外键。
初始化与迁移分开。bash scripts/fago.sh bootstrap 只在租户不存在时创建第一个租户和管理员,不插入测试夹具。集成测试使用专用测试库,测试数据不进入这个初始化。
迁移命令与 API 使用相同数据库构建目标;二进制只嵌入该方言的 SQL,不匹配的 driver 在申请连接前拒绝。PostgreSQL 须设置 APP_DATABASE_DRIVER=postgres 或 FAGO_DATABASE_BUILD=postgres,直接执行 Go 命令时添加 -tags=fago_postgres。达梦须设置 APP_DATABASE_DRIVER=dm 或 FAGO_DATABASE_BUILD=dm,并添加 -tags=fago_dm;达梦 DDL 可能隐式提交,失败会保留 dirty 版本,需按 M0 实施与验收 人工恢复。Oracle、SQL Server 仍未纳入迁移命令。风险结论见同文档达梦章节。
M3 的 v10 将历史租户绑定不可编辑兼容套餐,保留身份、会话及自定义权限;新增租户会话版本隔离、套餐能力关联和平台审计。v11 发布平台审计导航。初始化仍是单独的显式操作;具体步骤见 平台租户与套餐。两库已验证空库与 v1/v4/v5/v6/v8/v9 有数据升级,见 M3 实施记录。
发布前备份、失败迁移恢复与回滚演练见 发布验证与恢复演练。
M5 的 v14 增加自选部门关系及范围约束,不更改历史角色、权限和菜单。升级前备份,显式迁移后再启动当前构建;MySQL/达梦 DDL 可隐式提交,失败时保留 dirty,核对实际列宽/约束/新表后修复,不能直接清标记重跑。
M5 的 v15 新增三个只读全局模板表与三个租户字典/参数表,发布 infra.configuration 能力和对应权限/导航。现有套餐不会自动开通;升级推进租户授权版本与 admin 策略版本,使导航重新求值。模板复制来源是历史元数据,不建到可变全局模板的外键,租户副本独立。配置值不进入审计;敏感原值仍属于数据库敏感数据。操作见 字典与参数配置。
# v27–v29基础设施升级
升级前停止旧worker,备份业务库,再显式迁移并启动匹配的API/worker/前端。v27把旧非Cron计划停用待配置,保留原时间字段、载荷和历史,推进准入代次防止重新启用复活旧运行;不能把61秒等间隔自动等价转换为五段Cron。v28给全局目录增加平台发布元数据,已有租户副本保持原版本和原值;v29追加独立平台父任务、真实租户子运行和统计结果表,不自动创建或启用任务。
# 使用已备份的同一环境配置;不要让旧worker在迁移中继续认领。
bash scripts/fago.sh migrate
# 成功后重新启动匹配版本,再在页面逐个配置、预览旧计划的Cron。
bash scripts/fago.sh worker
非空v26升级与重跑以双库集成结果为准,详见M5增量记录。MySQL/达梦DDL可能隐式提交,dirty后核对实际列、约束和表,禁止清标记盲重试。达梦v29只有显式迁移源码,尚未运行认证;旧v13行为PoC不能替代本次验证。
# v30 查询索引补齐
本版保持数据、权限和接口合同不变,补齐通知全局待办统计的 (state, created_at) 索引。PostgreSQL/达梦另增加用户角色关系的 (tenant_id, role_id, user_id) 反向索引;MySQL 已为对应外键建立可用的反向索引,不重复创建。索引会占用额外空间,DDL 期间也可能等待锁;先备份专用环境,在维护窗口执行显式迁移,再启动匹配的 API/worker。
沿用已配置的环境和所选数据库构建目标执行。v30引入时的迁移目标为30;当前构建会继续推进到33,旧版本的校验和和数据保持不变;不要通过 API 启动触发升级。
# 在外层仓库根目录,连接配置由当前环境 YAML/环境变量提供。
bash scripts/fago.sh migrate
# 成功后启动同版本程序。
bash scripts/fago.sh worker
数据库客户端可读取迁移元数据确认版本;历史1–30行及当前新增版本均应为非 dirty。以下查询不返回业务数据或连接凭证:
SELECT version, dirty FROM schema_migrations ORDER BY version;
本版同时减少租户/套餐列表、菜单授权、服务 scope、字典模板和代码生成的逐项查询,仍在调用者原事务快照内读取,不使用旧权限缓存或跨租户关联。PoC 工作流遇到缺失/null Completed 会拒绝并回滚,不静默恢复损坏的状态;这不扩展其生产支持范围。
MySQL/达梦 DDL 可能隐式提交。若失败且留下 dirty,先核对 ix_notice_task_state,以及 PostgreSQL/达梦的 ix_user_role_reverse 实际状态,再按迁移恢复规程处理;禁止清除 dirty 后盲目重跑。双库验证与达梦未认证边界见 M5 查询修复记录。
# v31–v32 工作流目录与定义元数据
这两个版本只交付正式工作流的持久元数据基础。v31增加全局运行时目录、唯一控制行与目录事件,v32增加租户定义/不可变版本/独立准入/命令事件;不会登记默认处理器、发布流程或开放在线审批菜单。workflow.definitions能力与对应权限已登记,已有套餐不会自动获得该能力;平台目录权限不授予租户定义访问权。
升级前备份并停止旧worker,确认所选方言与构建一致后显式迁移。v31/v32引入时目标为32,当前构建继续推进到33;成功后数据库包含1–33的全部非dirty记录;仅迁移完成不代表运行时已经登记或流程已经可以执行。
# 外层仓库根目录;沿用已备份环境的配置,不在命令中写数据库凭据。
bash scripts/fago.sh migrate
# 数据库客户端检查迁移元数据;当前版本应有43行,且dirty均为false/0。
SELECT version, dirty FROM schema_migrations ORDER BY version;
MySQL/达梦DDL可能隐式提交,失败保留dirty后核对 wf_runtime_*、wf_definition_* 表、复合外键及索引实际状态,按迁移恢复规程处理;不要清dirty后盲重试,也不要删除历史版本来满足新定义准入。发布内容和可变准入分表,未来实例须继续绑定原版本。
MySQL/PostgreSQL已验证非空v30/v31升级与重跑、权限不自动开通和目录保留。达梦仅有迁移源码及构建检查,v31/v32实库尚未认证。正式执行、资源/表单绑定、API/页面和完整恢复验收仍待实施,证据见M6实施记录。
# v33 规范化执行检查点
v33增加正式执行内核的实例、作用域、token、节点激活、join分支槽、类型变量、命令收据和追加事件表。每条租户子表关系都带tenant/instance复合外键;运行时活动引用、租户发起人列表、实例ready队列及历史读取有对应索引。不新增流程实例、证明资源、任务或默认运行池;workflow.execution能力不会自动授予已有套餐。
升级前备份并停止旧worker,再显式执行迁移。当前内核尚未装配正式审批/资源适配器及自动worker/API页面,迁移完成不等于已有可操作审批功能,也不能直接对外开放证明端口。
# 外层仓库根目录;使用所选方言与同一环境配置,凭据由配置层提供。
bash scripts/fago.sh migrate
# 成功后迁移元数据应包含1–33,全部非dirty;勿通过API启动自动迁移。
SELECT version, dirty FROM schema_migrations ORDER BY version;
MySQL/达梦DDL可能隐式提交。失败后保持dirty,核对新增表、scope自引用外键、租户复合外键和索引,再按恢复规程处理;不能删除旧实例/命令/历史来绕过迁移。MySQL/PostgreSQL专项记录见M6执行增量,达梦v33仅源码/构建检查,实库未认证。
# v34 真实审批数据基础
v34新增 wf_approval_groups、wf_tasks、wf_task_candidates、wf_decisions 与 wf_task_events。任务按tenant/instance/activation隔离;assignee/delegator、候选用户、实例历史均有组合索引。每任务一票、每人每激活一票,原候选来源和私有意见留存;不从旧实例猜测候选或自动新增任务,也不自动开放套餐/导航。
升级前备份数据库,停止旧worker并核对所选方言。凭据继续由环境YAML/环境变量提供,不写入命令:
# 外层仓库根目录;CLI按当前配置显式迁移,失败必须停止后续启动。
bash scripts/fago.sh migrate
# 成功后元数据应包含1–34且全部非dirty;API启动不会代替此步骤。
SELECT version, dirty FROM schema_migrations ORDER BY version;
审批/任务/临时授权要求同库事务。DDL失败时保持dirty,核对五张新表、租户复合外键、投票唯一键与索引后再按恢复规程处理;禁止清dirty盲重试或删除旧命令/审批历史。MySQL/PostgreSQL非空升级及专项证据见M6审批记录。达梦v34只有源码/构建检查,实库未认证。
当前尚无正式在线审批API/页面,资源/表单绑定、可靠命令、worker/定时器和完整版本退役仍在实施。迁移成功只代表数据结构就绪,不代表可以启用测试证明端口对外提供审批。
# v35 显式组织关系
v35新增 system_department_leaders 与 system_user_managers,使用同租户复合外键、独立版本和反向查询索引。未维护关系保持空;迁移不从管理员、部门首成员或旧实例推断审批人。清空保留版本记录,活动关系须先解除才能删除用户/部门。四个维护权限按既有组织/用户能力限制,不改已有自定义租户权限上限。
升级前备份并停止旧worker,在外层仓库根按当前私有配置显式执行:
bash scripts/fago.sh migrate
# 成功后schema_migrations应包含1–35且全部非dirty,API不会代替显式迁移。
SELECT version, dirty FROM schema_migrations ORDER BY version;
DDL失败时保留dirty,核对两张新表、租户/用户/部门复合外键与反向索引后按恢复规程处理。禁止通过清标记、删旧关系/旧实例来跳过错误。MySQL/PostgreSQL验证范围见M6组织关系记录;达梦仅有本批源码/构建检查,v35实库未认证。迁移完成后可使用组织关系维护API,工作流整体仍未完成。
# v36 发起自选快照
v36新增wf_start_selections,按租户/实例复合外键保存一次性的有序节点选择正文和摘要,后续任务操作不会覆盖。迁移不为历史实例回填审批人,不自动开放工作流菜单、套餐或资源访问权限;完整发起/审批HTTP与界面仍在M6实施。
在仓库根执行已有显式迁移入口,使用当前环境的专用数据库配置;先备份并核对当前v35历史,命令不会代替部署者选择数据库。
# 外层仓库根;scripts/fago.sh会加载统一Go环境,连接由当前环境配置提供。
bash scripts/fago.sh migrate
# 成功后schema_migrations应包含1–36且全部非dirty。
迁移后检查新表不含猜测生成的数据。旧实例继续保留原定义、原任务和命令收据,自选定义的新实例由发起事务创建快照:
SELECT version, dirty FROM schema_migrations ORDER BY version;
SELECT COUNT(*) FROM wf_start_selections;
-- 刚完成迁移、尚未创建新实例时,COUNT(*)应为0。
PostgreSQL失败回滚DDL;MySQL/达梦失败可能留下部分对象和dirty,必须按本页失败恢复规程核对后处理,不能清标记盲重试。达梦本批仍仅做源码/构建验证,不宣称v36实库认证;双库升级及快照恢复结果见M6记录。
# v37 内置表单资源
v37为fago-bpm建立版本化表单、私有草稿、不可变提交、按用途审批结果/活动占位、临时授权记录、私有命令收据及元数据事件表。这里只登记workflow.forms能力和四个bpm:form:*权限,不扩大已有套餐、不生成默认表单/流程、不添加菜单。当前实际实现为内置标量表单的后端服务,完整表单HTTP/页面和任务正文授权读取仍在M6实施。
在外层仓库根按当前环境配置显式迁移。先备份并核对历史校验和,API启动不会自动执行此命令:
bash scripts/fago.sh migrate
# 成功后schema_migrations应包含1–38且全部非dirty。
核对新表初始为空,不能从旧流程变量或测试夹具推断用户的表单、审批结果或授权:
SELECT version, dirty FROM schema_migrations ORDER BY version;
SELECT COUNT(*) FROM bpm_forms;
SELECT COUNT(*) FROM bpm_form_submissions;
SELECT COUNT(*) FROM bpm_form_grants;
-- 刚迁移且尚无新填报/发起时,上述三项COUNT(*)均应为0。
私有业务正文与通用审计分开保存,备份/恢复时必须连同定义、实例、提交、用途占位和授权一起保持一致,不能只备份最新草稿。PostgreSQL失败回滚DDL;MySQL/达梦可能留下部分对象和dirty,按本页恢复规程核对九张表与复合外键后处理,不清标记盲重跑。达梦本批仅构建,不宣称v37实库认证;自动升级与事务证据见M6记录。
# v38 受理命令查询索引
v38只追加ix_wfc_instance_state(tenant_id,instance_id,state,command_id),用于新运行时档案在实例内查找未完成accepted命令。不会改变旧命令状态/结果、运行时清单或表单正文,也不会为历史命令补造outbox。受理与恢复的后端能力和未完成范围见M6受理命令记录。
升级前停止旧worker并备份数据库,使用与目标方言匹配的构建执行显式迁移。数据库连接由当前环境YAML或操作者本机环境提供,不把DSN放进命令历史或日志。
# 外层仓库根目录;脚本负责source scripts/go-env.sh,不修改全局Go配置。
bash scripts/fago.sh migrate
# 成功后schema_migrations应包含1–38且全部非dirty。
# 使用数据库客户端核对新索引(示例为PostgreSQL;只读取结构,不含业务数据):
# SELECT indexname FROM pg_indexes WHERE tablename='wf_commands' AND indexname='ix_wfc_instance_state';
PostgreSQL迁移失败回滚DDL;MySQL/达梦DDL可能隐式提交,失败后保留dirty并检查新索引是否实际存在、列序是否匹配,再按本页恢复规程修复,禁止只清dirty盲目重跑。已完成的旧收据必须保留,不能通过删除命令来绕过迁移或清理未完成引用。双库非空升级/重跑与受理回归有专项证据;达梦本批仅迁移构建,未认证v38实库。迁移完成不代表自动worker、可靠外部动作或完整审批产品已开放。
# v39 后台命令队列与事件来源
v39追加wf_command_jobs、wf_command_attempts和固定命令/实例/engine的复合外键;领取索引按engine、状态、due、lease及租户/job建立,实例取消使用单独复合索引。迁移不为历史accepted创建job,不改变旧清单或命令结果。流程、任务和表单事件增加work_id/work_fence;在线事件保持正actor和空后台来源,后台事件要求actor为0且带完整工作来源。命令主体、发起人和人工决策的正用户约束保留。
升级前停止旧worker并备份,连接仍由当前环境私有YAML/环境变量提供。确认部署包携带完整旧处理器;本次迁移不会替代运行时兼容性或未完成实例排空。
# 外层仓库根目录,显式迁移;不会在API启动时自动运行。
bash scripts/fago.sh migrate
# 成功后schema_migrations应包含1–39,全部非dirty。
用数据库客户端只检查队列计数和安全状态,不读取或输出lease_owner、私有命令输入或表单正文。升级后没有新后台受理时,两张新表都应为空;历史accepted由原合同恢复,不自动升级为后台执行。
SELECT version, dirty FROM schema_migrations WHERE version = 39;
SELECT state, COUNT(*) FROM wf_command_jobs GROUP BY state;
SELECT state, COUNT(*) FROM wf_command_attempts GROUP BY state;
-- dead仍是待明确恢复的失败,不能当作命令done,也不能删除来释放资源占位。
PostgreSQL失败回滚DDL;MySQL/达梦可能隐式提交,须保留dirty并核对两张表、复合外键、索引、新列及事件CHECK,再按本页恢复规程处理,不能只清dirty盲重跑。备份需同时包含job/attempt、原命令/实例和资源数据,恢复时保留fence及尝试历史。达梦本批未进行v39实库认证。后台恢复须显式装配,正式worker默认关闭;定时器、实例自动续跑及正式进程配置见后续v40/v41与配置手册,完整滚动保护仍待W10/W12。范围见M6后台命令恢复。
# v40 激活级定时器
v40仅追加wf_timers/wf_timer_attempts、同租户实例/engine与激活/token外键,以及到期领取/实例清理索引;不改写旧命令、事件、表单或清单,不为历史等待补造截止。新定义只有绑定显式PersistentTimers运行时和真实定时器端口后才排定期限。DueAt为原始激活截止,ReadyAt用于退避或续跑,不能通过改DueAt延长已发布规则。
升级前备份并停止旧worker,核对仍保留全部在用处理器,再执行显式迁移。迁移不会自动启动TimerWorker,也不能代替旧版本排空/兼容性检查。
# 外层仓库根目录,连接由当前环境私有YAML或环境变量提供。
bash scripts/fago.sh migrate
# 成功后schema_migrations包含1–40,全部非dirty。
升级后没有显式新定时器发起时,两张新表为空。读取队列只查安全元数据,不读取或输出lease_owner、正文或内部错误链。
SELECT version, dirty FROM schema_migrations WHERE version = 40;
SELECT state, phase, COUNT(*) FROM wf_timers GROUP BY state, phase;
SELECT state, COUNT(*) FROM wf_timer_attempts GROUP BY state;
-- continuing表示原期限已经触发,正在恢复剩余自动节点;不是再次等待同一原截止。
-- dead保留原等待及失败历史,只能用当前管理身份的RetryTimer合同恢复,不能直接清表或重置DueAt。
PostgreSQL事务DDL失败回滚;MySQL/达梦可能隐式提交,失败保留dirty,核对两张新表、复合外键、CHECK和索引后按本页恢复规程处理,不清标记盲重跑。备份/恢复需连同timer/attempt、实例/token/任务和资源保持一致;fence、原截止与失败历史不能重置。后续v41已追加实例ready调度,正式worker可显式启用;完整滚动恢复/容量与真实DM仍待验收,范围见M6定时器记录。
# v41 实例级自动续跑
v41新增wf_ready_jobs/wf_ready_attempts及三个attempt表的活跃状态索引。
每个租户/实例只有一个可复用ready引用,旧manifest及旧实例不回填,不自动启用新行为。
只有显式AutomaticDispatch档案与全部实际ready端口合同相符的新实例才使用该调度;正式worker现可显式配置启用,默认关闭,操作见配置手册。
升级前备份,停止并等待旧worker退出,保留在用运行时处理器,再从外层根目录执行:
bash scripts/fago.sh migrate
# 成功后schema_migrations包含1–41,全部非dirty;尚无新档案实例时两张ready表为空。
迁移后检查版本与安全状态汇总。blocked表示尚有accepted命令优先执行,idle表示等待人工,
pending表示仍有自动节点;不能把idle解释为审批通过。dead保留失败预算与历史,须由当前管理者以队列版本调用RetryReady,
不能直接更新状态或清零fence。SQL只用于只读检查:
SELECT version, dirty FROM schema_migrations WHERE version = 41;
SELECT state, COUNT(*) FROM wf_ready_jobs GROUP BY state;
SELECT state, COUNT(*) FROM wf_ready_attempts GROUP BY state;
PostgreSQL事务DDL失败会回滚;MySQL/达梦可能隐式提交,dirty时须核对两张新表、复合外键、CHECK、
ix_wfrjob_due及三个ix_wf*attempt_active索引,再依本页恢复规程处理,不能只清dirty后盲目重跑。
备份恢复须连同原命令、实例、任务、资源、timer及ready历史保持一致;fence和不可变收据不可重置。
过期worker返回409001且整体回滚,由新租约重领恢复;当前父级取消保持标准取消语义,不分离成无限后台请求。
达梦v41仅构建检查;正式worker基础崩溃/停机恢复已有双库专项,完整滚动部署与容量仍未认证。证据和后续安排见M6自动续跑记录。
# v42 持续执行池与原子退役
v42新增wf_runtime_pools/wf_runtime_pool_versions/wf_runtime_pool_events,固定构建清单与api/worker角色,
增加运行时retire/reopen审计动作,以及三类队列和attempt的池来源字段。历史行使用空池/零代次,
不为旧领取伪造新执行者,不自动登记池或修改旧运行时清单。所有历史迁移字节保持不变。
从外层根目录显式迁移;连接及秘密由原环境提供,成功后应有1–42且全部非dirty。
bash scripts/fago.sh migrate
# 本节说明v42增量;当前命令还会继续应用后续迁移,不自动发布流程或打开worker。
只检查安全结构元数据,不读取lease owner或表单正文:
SELECT version, dirty FROM schema_migrations WHERE version = 42;
SELECT COUNT(*) FROM wf_runtime_pools;
SELECT COUNT(*) FROM wf_runtime_pool_versions;
SELECT COUNT(*) FROM wf_runtime_pool_events;
-- 仅迁移且未显式登记池时,三个计数均为0。
PostgreSQL事务DDL失败回滚;MySQL/达梦可能隐式提交,须保留dirty,核对三张新表、外键/索引、 六张队列/attempt的新列与CHECK及运行时事件动作后按本页恢复规程处理。不能只清dirty重跑, 不能清空fence或删除未完成队列使退役“通过”。备份恢复须保持目录、池成员、业务队列及attempt一致; 旧presence必须过期才能被忽略,不允许从备份直接复用本地owner恢复执行。
退役在同一runtime锁下重查所有启用定义、running实例、accepted命令和command/timer/ready未完成引用, 连同版本CAS与审计一起提交或回滚。idle池presence不算业务引用,避免最后池关闭与退役互相等待。 重新开放须精确构建及当前api/worker兼容覆盖,不自动开启旧定义。此处只有受信服务合同,管理HTTP继续W11。 达梦v42未做实库认证;完整滚动/容量与生产部署不由迁移通过代替,实际证据见M6实施记录。
# v43 持久外部动作与原响应收据
v43为显式v6运行时增加wf_external_jobs、wf_external_attempts和wf_external_receipts。
job绑定租户、实例、token及一次激活,固定输入和输出基线只在业务库保存;原execute与compensate收据分别保留。
节点kind约束增加external-action,历史节点、规范模型和运行时清单字节不变,不给旧实例补造动作或远端效果。
升级前停止不兼容旧构建并备份原业务库,保留实例、资源、运行时目录、池、动作队列和全部收据的一致快照。 连接仍由当前私有环境提供。迁移成功后应有1–43且全部非dirty,未显式使用新档案时三张新表为空:
# 外层仓库根目录;已配置目标方言和专用/业务环境,连接凭据不写入命令文本。
bash scripts/fago.sh migrate
# 此命令执行当前构建全部迁移;成功后确认当前version=47且全部dirty=false/0。
只读取安全结构/聚合元数据,不查询snapshot_json、response_json或lease_owner:
SELECT version, dirty FROM schema_migrations WHERE version = 43;
SELECT operation, state, may_have_effect, COUNT(*)
FROM wf_external_jobs GROUP BY operation, state, may_have_effect;
SELECT operation, COUNT(*) FROM wf_external_receipts GROUP BY operation;
PostgreSQL失败回滚DDL;MySQL/达梦可能隐式提交,须保留dirty并核对三表、复合外键/索引和节点kind约束,再按本页恢复规程处理。 迁移列表与逻辑版本不一致时也会以503001拒绝,不能把Run返回成功当作已跳过缺失脚本。 禁止清空fence/输入/收据或把未知效果改成done来释放退役阻塞;数据库恢复后原owner不能直接复用,须等待租约失效后按更高fence重领。
may_have_effect=true的未结算动作会阻止取消/拒绝/超时终态与运行时退役;dead不会自动复活。
当前管理服务提供显式重试及补偿申请,仍须当前身份、资源ACL、原job版本和命令幂等检查。
补偿必须由远端原子确认墓碑,确认后激活仍等待管理取消;不支持把补偿过的原业务键重新执行。
v43核心批次之后已接入正式外部动作配置/进程及首批审批HTTP;真实审批页面仍待W11,不能仅迁移就启用服务任务。 现有正式内置v1/v2清单保持原合同。达梦v43未做实库认证,完整滚动/容量和生产远端幂等认证也不由迁移通过替代。 实现、实际检查及剩余边界见M6记录。
# v44 本人已办查询索引
v44只追加ix_wfd_actor(tenant_id,actor_id,id),用于跨实例按实际投票人倒序分页;旧实例起首的历史索引继续保留。
不改写投票、意见、资源授权、旧模型或运行时清单,也不补造历史处理人。其他四类新列表复用既有主键及本人索引。
升级前备份同库一致快照,停止不兼容旧构建并按原显式入口执行。成功后1–44连续且全部非dirty;API仍不会自动补索引。
# 外层仓库根目录;连接由当前私有环境提供。
bash scripts/fago.sh migrate
# 确认当前逻辑版本44且全部非dirty,再启动匹配构建。
只检查安全的迁移及索引结构,不查询投票意见或表单字段。下列按目标方言二选一:
SELECT version, dirty FROM schema_migrations WHERE version = 44;
-- PostgreSQL
SELECT indexname FROM pg_indexes WHERE tablename='wf_decisions' AND indexname='ix_wfd_actor';
-- MySQL
SHOW INDEX FROM wf_decisions WHERE Key_name='ix_wfd_actor';
PG失败回滚DDL;MySQL/达梦可能隐式提交,须保留dirty并人工核对索引是否已建,再按本页恢复规程修复,不忽略“已存在”直接宣告成功。 索引创建耗时和锁等待取决于实际表大小,本机合成历史执行计划不代表生产建索引窗口或容量认证。 达梦v44仅构建,未执行实库。产品列表规则见工作流API,本批证据见M6记录。
# v45 参与人历史与原提交权限
v45新增workflow:history:read(workflow.execution)和bpm:form:history-read(workflow.forms)两项当前权限。
保留租户管理员获登记,但仍须满足本人发起/实际操作/精确当前任务关系,管理身份不等于任意正文可见。
不回填参与人、节点当时输入、正文收据或旧grant,不改旧模型、schema或运行时清单字节。
迁移仅为wf_events、wf_decisions、wf_task_events增加各自(tenant_id,instance_id,occurred_at,id)时间线索引,
并增加投票/任务事件的实例内actor参与索引。它们支持有界来源查询,不以LIMIT替代长历史扫描验证。
升级前保留同库一致备份,按显式入口执行,不让API自动建索引:
# 外层仓库根目录,连接由当前私有环境提供。
bash scripts/fago.sh migrate
# 当前命令执行全部迁移(含后续版本);本节只核对v45新增记录,再启动匹配构建。
只查安全结构元数据,不能为验收查询意见/原因/表单原值。PostgreSQL示例:
SELECT version, dirty FROM schema_migrations WHERE version = 45;
SELECT indexname FROM pg_indexes
WHERE indexname IN ('ix_wfe_timeline','ix_wfd_timeline','ix_wfte_timeline','ix_wfd_participant','ix_wfte_participant');
MySQL使用SHOW INDEX逐表检查;DM沿原显式脚本,仍未实库认证。PG失败回滚DDL;MySQL/DM可能部分提交,须保留dirty、人工核对五索引/两权限和角色映射后恢复。
不自动忽略已有索引或重复权限;建索引的生产锁窗口仍须实际环境评估。
原提交合同、权限和失败规则见工作流API,验收范围见M6记录。
# v46 本人操作记录索引
v46仅追加wf_task_events(tenant_id,actor_id,action,id)索引ix_wfte_actor_action,不添加权限或改写旧事件、投票、运行时清单。
实例内历史索引不能直接覆盖跨实例本人列表;新查询四种等值动作分别取51条再合并,避免按IN结果全量排序或扫描大量非参与管理事件。
先备份同库一致数据,再在外层根目录显式迁移,成功后才启动匹配构建:
bash scripts/fago.sh migrate
# 成功:当前构建全部迁移连续且非dirty;本节只核对v46新增索引;API启动不代替此步骤。
PostgreSQL可只检查安全结构元数据;MySQL使用SHOW INDEX FROM wf_task_events核对同名四列顺序。
SELECT version, dirty FROM schema_migrations WHERE version = 46;
SELECT indexname, indexdef FROM pg_indexes
WHERE tablename = 'wf_task_events' AND indexname = 'ix_wfte_actor_action';
PostgreSQL迁移失败整体回滚;MySQL/达梦DDL可能隐式提交,保留dirty并人工核对索引后按恢复规程处理,不能自动忽略“已存在”。 建索引的耗时与锁等待须在实际部署库评估。本机合成数据的ID访问计划不代表完整关联/HTTP延迟或生产容量;达梦本增量仅构建,未实库认证。 接口规则见工作流API,结果见M6记录。
# v47 工作流本人页面导航
v47仅为已实现的租户Vben页面新增四个发布目录,不增加权限、套餐能力、普通角色菜单或历史执行权:
WorkflowTasks使用workflow:task:read,WorkflowStarted使用workflow:instance:start,
WorkflowActivities使用workflow:history:read,WorkflowForms使用bpm:form:read。
主库菜单仍按当前角色菜单、有效权限和套餐能力取交集;保留角色也不能跨越租户上限或实际资源资格。
外层根目录先备份再显式迁移。升级推进所有既有租户authz_version及admin全局策略版本一次,platform不推进;重复Run不重复增量。
bash scripts/fago.sh migrate
# 成功:1–47连续且dirty=false/0;再启动匹配的前后端构建。
下面只查安全目录,不查询凭据或业务正文。普通角色还须通过现有角色授权页面显式选菜单;本SQL只核对发布结果,不代替授权。
SELECT realm,name,path,component,permission_code,enabled
FROM auth_menu_catalog
WHERE realm='admin' AND name IN ('WorkflowTasks','WorkflowStarted','WorkflowActivities','WorkflowForms')
ORDER BY name;
SELECT version,dirty FROM schema_migrations WHERE version=47;
PostgreSQL失败回滚当前迁移;MySQL/达梦可能部分提交,保留dirty,人工核对四菜单和版本状态后按本页恢复流程处理。 不忽略唯一键错误,不因目录存在就当作API/worker已配置。达梦此增量仅构建,未实库认证。 实际页面步骤见审批中心,验证边界见M6记录。
# v48 工作流管理页面导航
v48只登记四个租户管理菜单及一个平台运行目录菜单,原权限、套餐、普通角色菜单和业务历史不变。 全部租户authz_version及admin/platform策略版本各增加一次,旧会话重新求当前菜单交集,不自动开通工作流能力。 菜单、路径和权限见管理手册。
# 先按当前环境的发布恢复规程备份,再显式迁移;不要靠API启动自动升级。
bash scripts/fago.sh migrate
# 完成后版本1–48连续、dirty均为false;重复执行不得重复增加菜单或授权版本。
PostgreSQL显式迁移事务失败整体回滚;MySQL/达梦遵循原dirty恢复规程,失败后核对实际目录与版本增量, 不能直接清dirty或删除旧目录重跑。v47的四菜单增量在原单步验证,随后才应用v48;不能把新菜单误判为旧脚本重复执行。 实库与未认证边界见M6管理页记录。