From 1b7c58939f457de525684116bdcceb0c4d6a5324 Mon Sep 17 00:00:00 2001 From: xuans Date: Sun, 27 Sep 2026 21:52:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=95=B4=E6=94=B9=E8=BF=9B?= =?UTF-8?q?=E5=BA=A6=E5=8F=8AMySQL=E8=A7=A6=E5=8F=91=E5=99=A8=E5=A4=87?= =?UTF-8?q?=E4=BB=BD=E9=AA=8C=E8=AF=81=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/Scert开发任务清单.md | 8 ++- doc/Scert整改任务执行清单.md | 19 +++++- doc/Scert整改合并优化清单.md | 70 +++++++++++---------- doc/全面审查测试与优化记录.md | 2 + doc/基础整改任务规格.md | 11 +++- doc/构建版本与数据库支持矩阵.md | 62 ++++++++++++++++++ doc/生产部署与运维说明.md | 4 ++ 7 files changed, 137 insertions(+), 39 deletions(-) diff --git a/doc/Scert开发任务清单.md b/doc/Scert开发任务清单.md index e75ca96..4bf7fa2 100644 --- a/doc/Scert开发任务清单.md +++ b/doc/Scert开发任务清单.md @@ -2,6 +2,8 @@ > 2026-09-27 任务规格:完整 44 项及六阶段验收规范见《整改任务规格与验收约定》和《Scert整改任务执行清单》。以下历史勾选不替代当前整改状态,不把旧测试结果当成新增需求已经实现。 +> 2026-09-27 当前进度:原始整改清单、执行清单和分级规格同步标记状态。P0-05 `[~]`:`3f6d5b8` 增加 MySQL 自有触发器备份、恢复顺序和可见权限预检,Windows 双版本最终全专项通过;证据见《构建版本与数据库支持矩阵》第十一节。例程、事件、视图、其余数据库和生产门禁仍未完成,不以本轮局部通过作生产放行。 + > 2026-09-27 范围调整:本文件保留早期开发历史,当前执行以《Scert整改合并优化清单》和《Scert整改任务执行清单》为准。正式交付仅为 Web 和 Windows/Linux 服务端;本文件中的 Wails 桌面窗口、托盘、桌面更新、桌面配置和桌面 UI 测试均退出正式开发及验收范围,不再作为未完成交付项。CLI 限定为初始化及服务运维,不另建业务管理界面。 > 同日 CLI 调整:下文 `domain`、`server`、`ssh-key`、`renew`、`deploy` 等业务命令及其测试结果仅为历史记录,当前正式入口已停用,请使用 Web;详见《命令行运维范围说明》。 @@ -11,8 +13,10 @@ > 文档用途:作为 Scert 项目后续开发、进度跟踪、阶段复审和验收的执行清单。 > > 项目名称:Scert -> 当前阶段:开发启动前任务规划 -> 文档状态:已生成,等待执行 +> 当前阶段:整改实施与分层验证 +> +> 文档状态:保留开发历史,当前进度由整改执行清单和分级规格统一跟踪 +> > 编制日期:2026-08-25 > Git 远程名称:Scert > Git 远程地址:`https://git.pcux.cn/xuans/Scert.git` diff --git a/doc/Scert整改任务执行清单.md b/doc/Scert整改任务执行清单.md index 092471f..aed9962 100644 --- a/doc/Scert整改任务执行清单.md +++ b/doc/Scert整改任务执行清单.md @@ -15,7 +15,7 @@ 5. 不将密码、RAM 密钥、Token、私钥、真实证书或 Cookie 写入代码、文档、日志和 Git。 6. 每个任务完成后先标记为 `[x]`,复审和对应范围的验收证据齐全后才能标记为 `[✓]`。 -逐项规格入口:《整改任务规格与验收约定.md》。P0/P1/P2/P3 分别见《基础整改任务规格.md》《核心能力任务规格.md》《运维验收任务规格.md》《增强能力任务规格.md》,共 44 项;每项具备全部原定字段及独立六阶段状态。汇总状态与规格同步更新,原始清单保留为需求基准。 +逐项规格入口:《整改任务规格与验收约定.md》。P0/P1/P2/P3 分别见《基础整改任务规格.md》《核心能力任务规格.md》《运维验收任务规格.md》《增强能力任务规格.md》,共 44 项;每项具备全部原定字段及独立六阶段状态。汇总状态、原始清单状态与规格同步更新;原始清单的需求和验收标准仍保留为基准,不随局部实现缩减。 ## 二、当前基线证据 @@ -39,7 +39,7 @@ | P0-02 | [x] | 建立完整任务清单 | 44 项逐项规格、原始编号名称、字段、六阶段、引用和汇总状态核对通过 | 等待最终复审,随实现同步状态和证据 | 四份规格、统一验收约定及 `fab98d1` 独立克隆 | | P0-03 | [x] | 整理源码、构建产物和部署产物 | 全仓库及子目录规则、目录说明、正式回归和独立克隆构建校验通过 | 等待最终复审,后续提交继续执行边界检查 | 正式 Go 回归、完整索引、双平台 33 项清单及解包校验 | | P0-04 | [~] | 统一开发和构建版本 | 精确工具链、安装策略、发布前后校验、系统清单及固定换行已实现,双独立克隆和完整自动化通过 | Linux 原生构建与双平台实际运行环境记录,不以交叉编译替代 | `94237b8`、175 项前端测试、后端完整回归、4 个 Web 文件一致、33 项清单和解包校验 | -| P0-05 | [~] | 确认数据库正式支持矩阵 | 特殊列双向官方互操作及官方存储对象 SQL 恢复已通过;自有导出的对象完整性仍缺 | 补对象清单、权限及导出完整性、其他 SQL 模式、独立发行验证;Linux、PostgreSQL、SQLite 与正式服务门禁仍缺 | `e6e6719` 双版本分别 85、87 个叶子用例,0 失败、0 跳过;详见支持矩阵第九、十节 | +| P0-05 | [~] | 确认数据库正式支持矩阵 | 已增加自有触发器导出及可见权限预检;例程、事件、视图和完整对象清单仍缺 | 补剩余对象导出、其他 SQL 模式和独立发行验证;Linux、PostgreSQL、SQLite 与正式服务门禁仍缺 | `3f6d5b8` 双版本最终完整回归分别 97、104 个叶子用例,0 失败、0 跳过;详见支持矩阵第十一节 | | P0-06 | [~] | 建立统一领域模型 | 已有域名、证书、任务、服务器等实体,项目和部署关联仍需审查 | 补齐资源关系图、外键/归属和任务关联 | 模型文档、迁移检查、接口测试 | | P0-07 | [~] | 增加项目级权限和资源隔离 | 用户组和角色已有实现,项目级资源边界未闭环 | 为证书、DNS、服务器、任务和审计补齐项目归属及越权测试 | 权限矩阵、接口越权测试 | | P0-08 | [~] | 完善凭据和主密钥生命周期 | 已有凭据存储与测试,轮换、恢复、删除和失效证据不完整 | 补齐创建、轮换、恢复、删除、脱敏和不可恢复边界 | 安全测试、日志审查、恢复演练 | @@ -332,3 +332,18 @@ P0-05 从 `[!]` 调整为 `[~]`,并未标记完成;P0-04 剩余门禁和全 证据:`artifacts/mysql-pending-review-20260927/review-mysql57.jsonl`、`review-mysql80.jsonl`;本轮为 `artifacts/mysql-stored-programs-20260927/mysql57-review.jsonl`、`mysql80-review.jsonl`。权限、官方工具选项、SQL 模式差异和准确计数口径见支持矩阵第九、十节。 已重新核对原始需求及执行清单,44 个任务编号全部保留。P0-05 仍为 `[~]`,没有把某个导入方向通过等同于完整备份恢复或生产放行。 + +### 2026-09-27:P0-05 自有触发器备份、权限及文档进度同步 + +修改前检查点 `d7f6ac1`;实现与正式测试 `3f6d5b8` 已提交推送。本批从 20:42 开始,最终双版本复测于 21:45 结束,中间包含非持续执行时间,不把墙钟间隔当成测试耗时。 + +- `[x]` 实库复现:自有备份遗漏触发器;无 `TRIGGER` 权限时对象被隐藏,旧实现仍报告成功并覆盖已有备份。 +- `[x]` 导出修复:保存原始触发器定义和定义者,按真实执行顺序导出;保留 SQL 模式、字符集和排序规则,先恢复表数据再创建触发器。 +- `[x]` 权限预检:覆盖全局、库级、表级、精确授权遮蔽、启用及嵌套角色、未启用角色、动态权限与部分撤销。无可证明权限时失败并保留旧备份;歧义通配组合仍保守失败,后续需完善。 +- `[x]` 正式验证:Scert 与官方客户端分别恢复四个触发器,比较元数据并实际执行;覆盖名称与执行顺序相反、审计副作用、Latin-1 正文、分隔符冲突和创建时不同数据库排序规则。 +- `[x]` 最终专项:Windows MySQL 5.7.44 / 8.0.45 分别通过 97 / 104 个叶子用例,0 失败、0 跳过;后端全量测试、vet、模块校验通过;Linux 仅交叉编译。前端未修改、未重测。 +- `[x]` 测试收尾:累计 51 个独立实例退出,记录的测试端口无监听,初始化口令文件为空;共享 MySQL 进程未动。测试数据、随机密钥、日志和二进制不提交。 +- `[x]` 文档进度同步:原始清单只更新状态和进度说明,不修改需求与验收标准;执行清单、基础规格、支持矩阵、历史开发清单、审查记录和生产运维说明同步指向本批证据。 +- `[ ]` 后续:例程、事件、视图、完整对象清单权限、其他 SQL 模式、复杂授权组合、定义者迁移、独立发行命令、Linux 实库、PostgreSQL、SQLite 及正式业务部署。 + +证据目录:`artifacts/mysql-native-triggers-20260927/`,最终结果为 `mysql57-final.jsonl`、`mysql80-final.jsonl`;详见支持矩阵第十一节。全部 44 项范围不变,P0-05 保持 `[~]`,本批不作生产放行。 diff --git a/doc/Scert整改合并优化清单.md b/doc/Scert整改合并优化清单.md index 2dcf71a..5abd259 100644 --- a/doc/Scert整改合并优化清单.md +++ b/doc/Scert整改合并优化清单.md @@ -6,6 +6,8 @@ > 明确排除:Wails 桌面版 > 整改日期:2026 年 9 月 27 日 +> 进度同步:2026 年 9 月 27 日。任务状态与《Scert整改任务执行清单.md》及四份分级任务规格保持一致;本文件的需求和验收标准不因状态更新而缩减。详细变更、验证命令、证据和剩余缺口见执行清单与对应专项记录,`[~]` 仅表示已有实现或正在整改,不表示整项完成。 + --- ## 一、整改目标 @@ -61,7 +63,7 @@ ## P0-01 明确产品范围 -**状态:** `[ ] 未开始` +**状态:** `[x] 已完成,等待复审` ### 整改内容 @@ -77,7 +79,7 @@ ## P0-02 整理项目任务清单 -**状态:** `[ ] 未开始` +**状态:** `[x] 已完成,等待复审` 将现有任务拆分为:需求确认、代码实现、自动化测试、隔离环境测试、生产部署测试、最终验收。 @@ -109,7 +111,7 @@ doc/生产部署与运维说明.md ## P0-03 整理源码、构建产物和部署产物 -**状态:** `[ ] 未开始` +**状态:** `[x] 已完成,等待复审` 建立明确目录边界: @@ -148,7 +150,7 @@ dist/ ## P0-04 统一开发和构建版本 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` 统一记录并固定以下版本: @@ -174,7 +176,7 @@ npm.cmd run build ## P0-05 确认数据库正式支持矩阵 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` 项目当前涉及 SQLite、MySQL、PostgreSQL,需要明确正式支持范围。 @@ -206,7 +208,7 @@ backend/internal/database/migrations/sqlite/ ## P0-06 建立统一领域模型 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` 建议统一核心实体: @@ -241,7 +243,7 @@ backup_records 备份记录 ## P0-07 增加项目级权限和资源隔离 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` 建议角色: @@ -275,7 +277,7 @@ updated_by ## P0-08 完善凭据和主密钥生命周期 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` 统一管理 DNS API 凭据、SSH 私钥、SMTP 凭据、HTTP 通知密钥、数据库密码、ACME 账户信息和证书私钥。 @@ -303,7 +305,7 @@ updated_by ## P0-09 强化 SSH 主机身份验证 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` - 保存 SSH 主机指纹。 - 首次连接要求确认指纹。 @@ -323,7 +325,7 @@ updated_by ## P0-10 统一任务、部署和回滚事务模型 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` 所有长耗时操作统一进入任务中心: @@ -355,7 +357,7 @@ DNS 验证 ## P0-11 建立生产验收门禁 -**状态:** `[ ] 未开始` +**状态:** `[!] 暂缓或存在阻塞` 生产验收必须拆分为: @@ -386,7 +388,7 @@ DNS 验证 ## P0-12 完成备份和恢复方案 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` ### 需要备份 @@ -422,7 +424,7 @@ DNS 账户配置 ## P1-01 建设统一证书中心 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` 页面建议: @@ -453,7 +455,7 @@ frontend/src/views/Certificates/ ## P1-02 完善证书详情和版本管理 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` 证书详情至少包含: @@ -492,7 +494,7 @@ DNS 验证方式 ## P1-03 完善 ACME 和 DNS 管理 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` 支持: @@ -518,7 +520,7 @@ frontend/src/views/DNSDelegations/ ## P1-04 建设任务中心 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` 页面建议: @@ -546,7 +548,7 @@ frontend/src/views/Tasks/ ## P1-05 统一续期策略 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` 续期策略支持: @@ -571,7 +573,7 @@ frontend/src/views/Tasks/ ## P1-06 建设服务器和部署目标中心 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` 页面建议: @@ -601,7 +603,7 @@ frontend/src/views/Servers/ ## P1-07 建设多服务器部署策略 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` 支持: @@ -635,7 +637,7 @@ HTTPS 验证 ## P1-08 建设通知中心 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` 页面建议: @@ -659,7 +661,7 @@ frontend/src/views/Notifications/ ## P1-09 建设审计中心 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` 页面建议: @@ -731,7 +733,7 @@ Dashboard 展示: ## P1-11 建设备份恢复页面 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` 页面建议: @@ -755,7 +757,7 @@ frontend/src/views/Backups/ ## P1-12 统一 API 契约和权限矩阵 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` 整理所有接口: @@ -793,7 +795,7 @@ backend/internal/httpapi/ssh_key.go ## P2-01 统一 Web 页面结构 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` 建议目录: @@ -818,7 +820,7 @@ frontend/src/views/ ## P2-02 统一中文显示和错误信息 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` - 不允许出现 HTML 实体编码。 - 不允许出现英文状态值直接展示。 @@ -840,7 +842,7 @@ cancelled 已取消 ## P2-03 所有长操作任务化 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` 以下操作不能长期阻塞 HTTP 请求: @@ -859,7 +861,7 @@ DNS 验证 ## P2-04 增加幂等和重复操作保护 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` 增加: @@ -877,7 +879,7 @@ DNS 验证 ## P2-05 完善日志、指标和追踪 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` 日志增加请求 ID、任务 ID、用户 ID、项目 ID,并对敏感字段脱敏。 @@ -897,7 +899,7 @@ DNS 验证耗时 ## P2-06 完善接口和前端测试 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` 后端验证: @@ -917,7 +919,7 @@ npm.cmd run build ## P2-07 完善升级、降级和卸载流程 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` 需要提供: @@ -936,7 +938,7 @@ npm.cmd run build ## P2-08 完成 Windows Service 实机验收 -**状态:** `[ ] 未开始` +**状态:** `[!] 暂缓或存在阻塞` 验证安装、启动、停止、重启、开机启动、异常恢复、日志目录、配置目录、数据目录、卸载和升级。 @@ -948,7 +950,7 @@ deploy/install-windows.ps1 ## P2-09 完成 Linux systemd 实机验收 -**状态:** `[ ] 未开始` +**状态:** `[!] 暂缓或存在阻塞` 验证安装、启动、停止、重启、开机启动、异常恢复、运行用户、日志输出、配置目录、数据目录、升级和卸载。 @@ -961,7 +963,7 @@ deploy/systemd/ ## P2-10 完善安全基线 -**状态:** `[ ] 未开始` +**状态:** `[~] 进行中` 检查: @@ -1083,4 +1085,4 @@ P0-11 生产验收门禁 4. 每次修改前先检查当前分支、工作区和未提交变更。 5. 每完成一个任务,补充验证命令和验收证据。 6. 代码标识符使用英文,界面、注释、文档和用户提示使用中文。 -7. 每次测试区分本地、隔离环境、测试环境和生产验收结果。 \ No newline at end of file +7. 每次测试区分本地、隔离环境、测试环境和生产验收结果。 diff --git a/doc/全面审查测试与优化记录.md b/doc/全面审查测试与优化记录.md index 62c0cdf..d419a50 100644 --- a/doc/全面审查测试与优化记录.md +++ b/doc/全面审查测试与优化记录.md @@ -2,6 +2,8 @@ > 2026-09-27 证据索引:当前 44 项整改的逐项范围、命令、实机步骤和复审字段见《整改任务规格与验收约定》及四份分级规格;实际进展以《Scert整改任务执行清单》为准。本文历史结果须按当时源码与环境解释。 +> 2026-09-27 本批进度:P0-05 `[~]`。`3f6d5b8` 修复自有 MySQL 触发器丢失和无权限仍成功的问题;最终全专项通过 5.7 的 97 个、8.0 的 104 个叶子用例,0 失败、0 跳过。权限前提、字符集/顺序验证和剩余缺口统一记录于《构建版本与数据库支持矩阵》第十一节;本批仅为 Windows 隔离实库,不是生产验收。 + > 2026-09-27 范围调整:以下为历史审查证据。当前正式测试范围仅为 Web 和 Windows/Linux 服务端;历史桌面模块测试记录保留,但不再作为交付目标或生产门禁。当前任务状态见《Scert整改任务执行清单》。 ## 一、范围与需求确认 diff --git a/doc/基础整改任务规格.md b/doc/基础整改任务规格.md index 73b54fb..d7cc658 100644 --- a/doc/基础整改任务规格.md +++ b/doc/基础整改任务规格.md @@ -63,7 +63,7 @@ - 任务编号:P0-05;任务名称:确认数据库正式支持矩阵;优先级:P0。 - 当前状态:`[~] 进行中`。 - 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[~]`;生产部署测试 `[!]`;最终验收 `[ ]`。 -- 问题说明:已修复迁移、连接恢复、备份会话、精确数值、跨表快照、失败文件保护、生成列和不可见列导出;现已支持本批官方存储对象 SQL 的分隔符恢复。自有导出的对象完整性、其他 SQL 模式及独立发行验证仍不足。 +- 问题说明:已修复迁移、连接恢复、备份会话、精确数值、跨表快照、失败文件保护、生成列和不可见列导出;支持本批官方存储对象 SQL 的分隔符恢复,并新增自有触发器导出与可见权限预检。例程、事件、视图等对象完整性、其他 SQL 模式及独立发行验证仍不足。 - 涉及文件:`backend/internal/database/`、其 `migrations/mysql/`、`migrations/postgres/`、`migrations/sqlite/`、`backend/internal/cli/`、《构建版本与数据库支持矩阵.md》。 - 依赖任务:P0-04。 - 整改内容:明确 SQLite、MySQL、PostgreSQL 支持版本;验证 MySQL 5.7/8.0、PostgreSQL 目标版本、SQLite 锁并发;逐库检查类型、索引、默认值、事务及初始化、升级、回滚、备份恢复。不能悄然去掉难测版本。 @@ -72,6 +72,15 @@ - 验收证据:在既有迁移、连接恢复、快照和失败边界基础上,`f260b22` 增加特殊列双向官方工具互操作,`e6e6719` 增加官方存储对象恢复。最终候选在 Windows MySQL 5.7.44、8.0.45 分别通过 85、87 个叶子用例,0 失败、0 跳过;对应含父项记录为 95、97。已实际执行触发器、过程、函数和隔离事件。详见支持矩阵第九、十节及执行清单。 - 复审结果:上述 Windows 隔离范围通过,不等于生产放行。只验证 InnoDB 数据快照,不承诺并发 DDL 一致性;非事务表和视图拒绝属于临时边界。官方导出文件恢复通过不证明自有导出保存了全部对象;其他 SQL 模式、定义者迁移、独立发行命令、Linux 实库、PostgreSQL 当前复测、SQLite 并发锁及正式服务验收仍未完成。 +### P0-05 触发器自有备份子任务进度 + +- `[x]` 复现自有备份丢失触发器,以及权限不足时隐藏触发器仍报告成功的问题。 +- `[x]` 实现按执行顺序导出原始定义、定义者、SQL 模式、客户端字符集、连接和数据库排序规则;先恢复基础数据再创建触发器。 +- `[x]` 全局、库级、表级、角色、部分撤销和授权遮蔽的可见权限预检;不能证明权限时失败并保留既有备份。 +- `[x]` 最终候选 `3f6d5b8` 的 Windows MySQL 5.7.44 / 8.0.45 完整专项回归通过 97 / 104 个叶子用例,0 失败、0 跳过;官方客户端也验证了自有触发器文件。 +- `[x]` 本批实现、最终复测、收尾与文档证据已核对;后端全量测试、vet、模块校验及 Linux 测试包交叉编译通过。细节见支持矩阵第十一节,不提升 P0-05 总状态,也不将交叉编译记为 Linux 实库通过。 +- `[ ]` 例程、事件、视图、其他 SQL 模式、完整表清单权限及剩余三库/双平台矩阵;歧义通配授权目前保守失败,不能视为所有权限组合均完整支持。 + ## P0-06 建立统一领域模型 - 任务编号:P0-06;任务名称:建立统一领域模型;优先级:P0。 diff --git a/doc/构建版本与数据库支持矩阵.md b/doc/构建版本与数据库支持矩阵.md index b9f41cf..f210c3c 100644 --- a/doc/构建版本与数据库支持矩阵.md +++ b/doc/构建版本与数据库支持矩阵.md @@ -299,3 +299,65 @@ PowerShell 5.1 的 `Tee-Object` 文件使用 UTF-16,复核时用 `Get-Content ### 尚未完成 Scert 自有导出仍需补齐触发器、例程、事件及视图,验证可见权限与完整对象清单,防止对象遗漏;本批导入能力不能证明导出完整。独立发行 CLI、Linux 实库、完整 Web 业务、服务重启和正式生产部署仍未验收。PostgreSQL、SQLite 和全部 44 项整改范围不变,P0-05 保持 `[~]`。 + +## 十一、MySQL 自有触发器备份与可见权限(2026-09-27) + +### 进度与实现范围 + +本批触发器子任务状态:`[x]`,实现与 Windows 隔离验证完成,等待完整范围复审;P0-05 总状态保持 `[~]`。修改前检查点为 `d7f6ac1`,实现与正式测试提交为 `3f6d5b8`,已推送。本节接续第十节的缺口,不把此前“官方文件导入”结果等同于自有导出完整。 + +- `[x]` 先复现:自有备份恢复后源库的触发器全部丢失;撤销 `TRIGGER` 后,源库真实存在触发器但 `information_schema.TRIGGERS` 返回空,旧实现仍成功并覆盖既有备份。证据为 `mysql57-before.jsonl`。 +- `[x]` 自有导出增加触发器。按同一表、时机、事件的 `ACTION_ORDER` 读取,不按名称假定顺序;使用服务器原始创建语句保留定义者和正文。所有表数据导出完成后再创建触发器,避免恢复历史数据时重放触发器副作用。 +- `[x]` 保留 SQL 模式、客户端字符集、连接排序规则和创建时数据库排序规则。正文先转换回原客户端编码并做往返一致性检查;分隔符按正文选择。成功恢复后恢复保存的会话属性,并将数据库排序规则设回源库当前值。创建时间戳不是可恢复的业务定义属性,不作相等承诺。 +- `[x]` 备份前证明每张可见基础表的 `TRIGGER` 权限。支持全局、库级、表级、已启用角色及嵌套角色,识别 8.0 部分撤销、独立动态权限行,以及精确库授权对通配授权的遮蔽。空触发器列表不能代替权限证明。 + +实现文件:`mysql_triggers.go`、`mysql_privileges.go`;入口为 `mysql_backup.go`。正式测试为 `mysql_triggers_integration_test.go`、`mysql_privileges_test.go`。没有新增临时辅助验收脚本。 + +### 正式隔离验证 + +`TestMySQLRealNativeTriggers` 使用同一隔离账户在新建测试库间恢复,不改写 `DEFINER`。自有文件分别交给 Scert 和官方 `mysql`: + +1. 四个触发器逐字段比较定义、顺序、SQL 模式、定义者、字符集及两种排序规则。 +2. 两个同表触发器故意让名称顺序与执行顺序相反,实际插入后应得到 `(4 + 2) * 3 = 18`。 +3. 恢复已有数据后审计表仍为空,随后新插入才由第三个触发器向审计表写入 `18`。 +4. 第四个触发器以 Latin-1 创建,正文含 `café;;`,同时覆盖非 UTF-8 编码、分隔符冲突和创建时不同的数据库排序规则。 +5. 撤销源账户 `TRIGGER`,先确认元数据确实隐藏,再断言备份明确失败、原备份内容不变、临时文件不残留。 + +`TestMySQLRealTriggerPrivileges` 在管理员创建的真实触发器上验证有效授权,并核对当前账户实际可见数量:5.7 为 9 个权限场景;8.0 额外覆盖动态权限、启用角色、嵌套角色、未启用角色、部分撤销,共 14 个。另有权限语句解析单元测试。通用隔离账户新增 `TRIGGER` 可见权限,旧官方恢复的权限失败用例显式撤销该权限,避免测试前提被夹具改变。 + +8.0 在启用二进制日志时创建触发器实际返回过 1419;仅在本次独立实例给专用账户授予所需 `SUPER`,没有修改全局函数信任开关,也没有给任何真实业务账户扩权。共享 MySQL 实例、生产数据库、远端服务均未操作。 + +### 证据与命令 + +证据根目录:`artifacts/mysql-native-triggers-20260927/`,不提交数据库、密钥、日志或二进制。首轮全专项证据为 `mysql57-review.jsonl`、`mysql80-review.jsonl`;最终复测使用独立的 `mysql57-final.jsonl`、`mysql80-final.jsonl`,不覆盖先前证据。 + +在 `backend` 目录执行: + +```powershell +$env:SCERT_MYSQL_TEST_ROOT = 'D:\Desktop\Scert\artifacts\mysql-native-triggers-20260927' +$env:SCERT_MYSQL_TEST_BIN = 'E:\DB\5.7\bin' +go test -json -p 1 -count=1 -timeout=8m -run '^TestMySQLReal' ./internal/database ./internal/cli | + Tee-Object -FilePath '../artifacts/mysql-native-triggers-20260927/mysql57-final.jsonl' +# 8.0 使用 E:\DB\8.0\bin,并将证据文件名改为 mysql80-final.jsonl。 +``` + +首轮完整专项:5.7.44 数据库包 54.342 秒、CLI 包 66.495 秒,109 个通过记录(含父项)、97 个叶子用例;8.0.45 分别 69.582 秒和 84.519 秒,116 个通过记录、104 个叶子用例。均无失败、无跳过。 + +最终候选复测(`mysql57-final.jsonl`、`mysql80-final.jsonl`): + +| 实际版本 | 数据库包 | CLI 包 | 通过记录(含父项) | 叶子用例 | 失败 / 跳过 | +|---|---:|---:|---:|---:|---:| +| MySQL 5.7.44 | 45.519 秒 | 67.048 秒 | 109 | 97 | 0 / 0 | +| MySQL 8.0.45 | 63.856 秒 | 80.795 秒 | 116 | 104 | 0 / 0 | + +后端 `go test -count=1 ./...`、`go vet ./...`、`go mod verify` 通过;Linux amd64 CLI 测试包交叉编译通过,未运行 Linux 实库。前端未修改,未重跑前端或浏览器测试。常规全量测试不是实库证据的替代,实库非跳过结果以上表为准。PowerShell 5.1 的 JSONL 使用 UTF-16,复核用 `Get-Content -Encoding Unicode`。 + +收尾:本批目录中累计 51 个隔离实例均退出,记录的 78 个测试端口无监听,51 份初始化口令文件为空;原有三个共享 MySQL 进程保持不变。复现、扩展测试和最终复测产物全部保留在忽略目录,不提交。没有清空生产或共享数据库,没有新增辅助脚本。 + +### 权限变化与仍未完成的边界 + +- 备份账户现在需要对每张可见基础表具有可证明的有效 `TRIGGER` 权限,即使实际没有触发器也不能省略。产品不会自行授予权限。恢复触发器还可能需要目标库 `ALTER`、适当定义者权限及二进制日志模式要求的权限;由管理员按环境审核,不建议给实际应用账户照搬测试的全局权限。 +- 多个相互遮蔽的通配库授权无法可靠证明权限时采取保守失败,应明确授予精确库或表权限。这是待完善的权限组合边界,不宣称任意授权组合均通过。 +- 本轮只证明已列出的基础表上触发器可见,仍需补齐完整表清单及例程、事件、视图的权限与导出;不能把不可见表当作不存在。非 InnoDB 表及视图仍为临时拒绝边界。 +- `NO_BACKSLASH_ESCAPES`、其他非 UTF-8 多字节编码、跨账户/跨服务器定义者、跨库引用、备份期间 DDL/授权变化、恢复中途失败后的数据库排序规则回退仍需单独验证;当前词法预检不是 SQL 语义预检或 DDL 原子恢复。 +- 独立发行 CLI、Linux 实库、PostgreSQL、SQLite、Web 业务及生产门禁保持未完成。全部 44 项继续保留,P0-05 不作生产放行。 diff --git a/doc/生产部署与运维说明.md b/doc/生产部署与运维说明.md index 2c6a54e..6d74641 100644 --- a/doc/生产部署与运维说明.md +++ b/doc/生产部署与运维说明.md @@ -271,6 +271,10 @@ SQLite 使用 `VACUUM INTO` 创建一致性快照并执行 `PRAGMA quick_check` MySQL 账号和密码从加密数据库凭据引用读取,只在维护连接期间存在于内存,不写回普通配置或备份清单。恢复前固定当前可用账号用于快照、导入和失败回滚;数据库服务端账号本身的密码轮换仍需单独管理,恢复旧配置不能自动恢复数据库账户密码。 +MySQL 自有备份已增加触发器导出。维护账户除读取表结构/数据外,还需对每张可见基础表具有可证明的有效 `TRIGGER` 权限;没有权限时,数据库可能隐藏触发器,Scert 会明确拒绝而不是报告不完整备份成功。即使业务当前没有触发器,也不能据此省略该可见权限。产品不会自动扩权;精确库级或表级授权由管理员审核配置,复杂且存在遮蔽的通配授权可能被保守拒绝。 + +恢复时先写入所有表数据,再创建触发器,并保留原定义者、SQL 模式和创建字符集。还需目标数据库的 `ALTER` 及实际服务器对定义者、二进制日志的权限要求;不能照搬隔离测试账户的全局管理权限。自有导出对例程、事件、视图及完整对象清单的支持尚未补齐,触发器验证不能作为完整 MySQL 灾难恢复验收。具体限制和当前证据见《构建版本与数据库支持矩阵》第十一节。 + ### 7.2 停服备份 ```bash