YoVision PostgreSQL 初始化
本目录实现 T-009~T-012 的 PostgreSQL 17.10 schema。SQL 必须按文件名前缀顺序执行:001~004 创建 NOLOGIN 权限角色、Bell/Sense 初始对象和配额权限;005~007 增量增加 Area 与审计;008~009 增加 Control API 状态;010~011 增加调和 fencing、MediaMTX Path 历史归属、孤儿报告/受控处置结果和对应最小权限。全部 SQL 可重放。应用登录角色及其密码由部署环境或密钥系统创建,并分别加入 bell_app、sense_app;仓库不保存登录凭据。
生产/共享实例必须由管理员先备份并在 YoVision 专用数据库中执行。Sense 进程不会用高权限自动建库或建角色。示例只使用私有环境变量,不把实际 DSN 写入脚本或日志:
安装 008 前必须先查询并为全部历史 sense.devices.area_id IS NULL/blank 记录完成经批准的 Area 归属;migration 会失败关闭而不会猜测或自动搬迁这些设备。
$env:YOVISION_PG_ADMIN_DSN = '由管理员私下设置'
Get-ChildItem deploy/postgres/[0-9][0-9][0-9]_*.sql |
Sort-Object Name |
ForEach-Object { & 'D:\pgsql17\bin\psql.exe' -X -v ON_ERROR_STOP=1 -d $env:YOVISION_PG_ADMIN_DSN -f $_.FullName }
不要把该示例替换成真实连接串后提交。自动验收使用 scripts/test_postgres.ps1 启动隔离临时集群,不读取或修改 D:\pgsql17\data。
权限边界
bell_app拥有bell.sites/bell.areas、版本 trigger、bell.site_quota_v1和bell.area_policy_v1。sense_app拥有senseschema,只获得bellschema 的USAGE和两个投影视图的SELECT。sense_app对 Bell 源表、Bell migration 表和 trigger function 没有权限;启动检查发现权限过宽时拒绝运行。sense.device_operation_outbox是本地持久化审计事实,不是 Bell 全局审计真相;relay 的传输、签名、确认和留存尚未实现。sense.control_idempotency_receipts不保存原始 Idempotency-Key,只保存 scope/request SHA-256 和脱敏响应快照;batch_operations/items 只保存逻辑 ID、状态和稳定错误,不保存连接秘密。- 调和与孤儿租约使用 PostgreSQL
clock_timestamp()和 fencing token;过期 worker 不能提交完成/失败或扫描报告。media_path_ownership、扫描和处置表不保存 endpoint、credential 或 source URI;数据库约束禁止为unownedfinding 写删除结果。 - PUBLIC 对两个业务 schema 的表和函数没有权限。
恢复
T-009~T-012 不迁移或删除现有 SQLite 数据,默认运行配置也仍为 SQLite。SQLite 不具备生产 Area/Outbox/Control API、多实例租约或孤儿处置一致性,业务路由不会在 SQLite 上注册。若 PostgreSQL 切换验证失败,先关闭 Control API 和孤儿扫描;需要实验室回退时停止 PostgreSQL 模式进程并恢复 SQLite DSN,不得误报为生产语义等价。schema 不提供自动 down migration;需要移除时由管理员先备份,再只删除明确确认的 YoVision 专用数据库,禁止对共享实例做模糊或递归清理。