同步整改进度及MySQL触发器备份验证记录

This commit is contained in:
xuans 2026-09-27 21:52:45 +08:00
parent 3f6d5b86b5
commit 1b7c58939f
7 changed files with 137 additions and 39 deletions

View File

@ -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`

View File

@ -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 保持 `[~]`,本批不作生产放行。

View File

@ -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. 每次测试区分本地、隔离环境、测试环境和生产验收结果。
7. 每次测试区分本地、隔离环境、测试环境和生产验收结果。

View File

@ -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整改任务执行清单》。
## 一、范围与需求确认

View File

@ -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。

View File

@ -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 不作生产放行。

View File

@ -271,6 +271,10 @@ SQLite 使用 `VACUUM INTO` 创建一致性快照并执行 `PRAGMA quick_check`
MySQL 账号和密码从加密数据库凭据引用读取,只在维护连接期间存在于内存,不写回普通配置或备份清单。恢复前固定当前可用账号用于快照、导入和失败回滚;数据库服务端账号本身的密码轮换仍需单独管理,恢复旧配置不能自动恢复数据库账户密码。
MySQL 自有备份已增加触发器导出。维护账户除读取表结构/数据外,还需对每张可见基础表具有可证明的有效 `TRIGGER` 权限;没有权限时,数据库可能隐藏触发器,Scert 会明确拒绝而不是报告不完整备份成功。即使业务当前没有触发器,也不能据此省略该可见权限。产品不会自动扩权;精确库级或表级授权由管理员审核配置,复杂且存在遮蔽的通配授权可能被保守拒绝。
恢复时先写入所有表数据,再创建触发器,并保留原定义者、SQL 模式和创建字符集。还需目标数据库的 `ALTER` 及实际服务器对定义者、二进制日志的权限要求;不能照搬隔离测试账户的全局管理权限。自有导出对例程、事件、视图及完整对象清单的支持尚未补齐,触发器验证不能作为完整 MySQL 灾难恢复验收。具体限制和当前证据见《构建版本与数据库支持矩阵》第十一节。
### 7.2 停服备份
```bash