-
1.1.2:遥测建表前先探测(issue #9) Stable
released this
2026-08-07 23:25:48 +08:00 | 165 commits to main since this releasePostgres 遥测撞上建表权限就整体判死的问题(issue #9)。最小权限部署会静默丢掉全部遥测: 应用账号有表级
INSERT、表也已存在,但没有 schema 的CREATE权限时,初始化的CREATE TABLE IF NOT EXISTS被拒 → recorder 永久 no-op,业务调用一切正常,只留一行 warning。下游 CHSAnalyzer3 首次端到端跑的 150+ 次调用耗时/token/成本因此全部丢失,且事后无法补回。根因是 PostgreSQL 对 schema 的 CREATE 权限检查早于
IF NOT EXISTS的存在性判断(PG 16.14 实测: 同一连接INSERT通过、to_regclass看得见表,该 DDL 照样被拒)——与 issue #3 修过的ALTER TABLE是同一类问题,当时只修了补列那一半。行为变更
- PG 侧建表前先
to_regclass探测,表已存在就一条 DDL 都不发。探测不需要任何权限,且与INSERT走同一套 search_path 解析(比裸 DDL 更准: 裸CREATE TABLE落在首个可建的 schema,可能与写入命中的不是同一张表)。表不存在时才建,新建表列已齐全,顺带跳过补列。 - "结构性失能"的判据收窄为「确定写不进去」,不再是「初始化时出过异常」。仅两种情形仍永久降级为 no-op: 建池失败(重试要在业务路径上内联吞掉连接超时)、表确定不存在且建不出来(后续 INSERT 必然全败)。探测失败、取连接失败改为只跳过本条并 warning,下次调用重新准备——初始化瞬间的一次抖动不再让整个进程失遥测。
- 日志措辞随之细分:
建池失败/建表探测失败(跳过本条,下次重试)/建表失败(表不存在,记录无处可落),原先一律是初始化失败。
不变
- SQLite 侧一行未改。实测其对已存在的表在解析期就把
CREATE TABLE IF NOT EXISTS短路掉(另一连接持BEGIN EXCLUSIVE、文件chmod 444时该语句均通过,而同条件的INSERT分别报 database is locked / readonly database),没有同款风险;加探测零收益,故有意不对称,只在 docstring 钉死实测结论。 - 遥测端口签名、22 字段、列序、
ON CONFLICT DO NOTHING幂等、单条写失败逐行丢弃的降级方向全部未动。错误面零变更。
升级提示
若你的部署此前为了绕开本问题给应用账号授了
CREATE ON SCHEMA,现在可以收回——表存在时库不再需要该权限。Downloads
- PG 侧建表前先