# PostGIS SRID 4326 元数据迁移 | 项 | 内容 | | --- | --- | | 目标 | 将 8 张已确认 WGS84、当前 SRID 0 的源表几何标记为 EPSG:4326 | | 状态 | 2026-09-05 已执行并通过迁移后严格 readiness | | 命令 | `go run ./cmd/postgis-srid-migrate` | | 数据决定 | 不修复 35 条无效几何,不改变 7 条空几何,不丢弃 Z | ## 已确认前提 - 数据提供方确认 8 张表的源坐标系均为 EPSG:4326,且无坐标偏移。 - 2026-09-05 只读预检发现 4,048 条非空几何全部为 SRID 0,坐标数值未越过 WGS84 范围。 - `st_2_xianyoufanghuotongdao.geom` 是不限定 typmod 的 `geometry`,包含 1,026 条二维和 2 条三维非空几何。 - 其余 7 张表是二维 `geometry(Geometry)` typmod,typmod SRID 为 0;必须由表所有者或等效迁移角色改为 `geometry(Geometry,4326)`。 - 原始导入 SQL 已由用户另行保存。执行前仍建议对当前数据库创建快照,因为原始导入文件不包含导入后的潜在变化。 ## 本次执行结果 - 使用与运行时只读账号分离的表所有者 `admin` 执行。 - 4,048 条非空几何全部从 SRID 0 补齐为 SRID 4326;迁移后 SRID 0 计数为 0。 - 7 张二维表改为 `geometry(Geometry,4326)`;防火通道保持裸 `geometry`。 - 防火通道的 1,026 条二维和 2 条三维非空几何分布未改变。 - 无 SRID WKB 指纹、总行数、空值、几何类型、有效性、范围和 Z/M 计数迁移前后一致,工具报告 `geometry_payload_unchanged=true`。 - 只读严格 probe 报告 `MCP spatial validation passed`;35 条无效面几何、7 条空几何和 7 张缺 GiST 索引表继续作为预期 warning。 ## 安全行为 迁移工具固定允许 8 张 `public` 表,不接受任意表名或目标 SRID。默认模式只读;写入必须同时提供: ```text --apply --confirm-source-crs=EPSG:4326 ``` 写入在一个 serializable 事务中完成,并使用 advisory lock、5 秒锁等待上限和 120 秒语句上限。事务内会: 1. 再次确认只出现 SRID 0/4326、类型符合表契约且坐标未越界。 2. 将 7 张旧二维 typmod 表原位改为 `geometry(Geometry,4326)`,使用 `ST_SetSRID` 补充元数据。 3. 保持防火通道列为裸 `geometry`,只对 SRID 0 的记录执行 `ST_SetSRID(geom,4326)`,保留混合 2D/Z。 4. 比较迁移前后的无 SRID WKB 指纹、行数、空值、有效性、类型、坐标维度以及 Z/M 计数。 5. 只有所有检查通过才提交;任一检查失败会回滚整个事务。 工具不会调用 `ST_Transform`、`ST_MakeValid` 或 `ST_Force2D`。 ## 凭证边界 运行时 `FIRE_SAFETY_POSTGIS_DSN` 应继续使用只读角色。迁移时另行在未提交的 `.env` 中配置: ```text FIRE_SAFETY_POSTGIS_MIGRATION_DSN=postgresql://<临时迁移账号>:@:/ ``` 该账号必须能更新全部 8 张表,并能修改 7 张旧 typmod 表的 `geom` 列;通常需要使用表所有者或数据库管理员临时执行。迁移完成后应从 `.env` 和部署环境移除该凭证。 ## 执行步骤 ```bash set -a source .env set +a # 只读预检 go run ./cmd/postgis-srid-migrate # 显式写入 go run ./cmd/postgis-srid-migrate \ --apply \ --confirm-source-crs=EPSG:4326 # 使用运行时只读账号执行严格验证 FIRE_SAFETY_POSTGIS_EXPECTED_SRID=4326 \ go run ./cmd/postgis-probe ``` 预期迁移后 8 张表的 `srids` 均为 `[4326]`。35 条无效几何、7 条空几何及缺少 GiST 索引仍应作为 warning 出现。 ## 回滚边界 - 提交前的任何失败自动整笔回滚。 - 提交后的恢复优先使用执行前数据库快照或用户保存并核验过的导入源。 - 不提供面向未来数据的盲目 `4326 -> 0` 回滚命令,避免把迁移后新写入且本来正确的数据错误标记为未知 SRID。