40 lines
3.2 KiB
Markdown
40 lines
3.2 KiB
Markdown
# 数据库所有权
|
|
|
|
Alembic 是唯一的 schema 入口。先对专用 PostgreSQL 18 数据库运行 `uv run --locked alembic
|
|
upgrade head`,API 不在启动时创建表。迁移账号拥有该数据库对象并需要 `CREATEROLE`;它不作为
|
|
任何运行服务账号。生产配置及登录角色由部署方提供,不在源码里设置默认数据库口令。
|
|
|
|
初始迁移建立两个受限的 `NOLOGIN` 权限组:`kf_oj_platform` 和 `kf_oj_coordinator`。
|
|
平台组创建 submission / queued evaluation / outbox,不能指定或更新执行状态、attempt 或成绩。
|
|
协调器组领取和更新评测、插入 attempt / 用例成绩及恢复通知,不能修改账号、题库或提交身份。
|
|
Worker 没有数据库角色,也不需要数据库连接配置。
|
|
|
|
后续迁移另建 `kf_oj_identity_operator` 与 `kf_oj_problem_import` 两个受限 `NOLOGIN`
|
|
权限组。前者只通过固定账号授权函数维护管理员能力/启用状态,不能读取口令哈希、
|
|
直接修改角色字段或绕过最后一名启用管理员保护;后者仅处理已授权导入、候选/工件与
|
|
追加审计,不能写评测状态、attempt、终态或表现指标。判题 Worker 继续无数据库身份。
|
|
平台写入权按列收敛;当前会话与授权版本在每次维护事务内重新核对。
|
|
|
|
可信表现指标由 Coordinator 在有效最终报告事务中派生,平台、导入器和普通 Worker
|
|
不得自行写入。候选与发布版本/用例不可变,成功维护回执及审计只追加;清理保留所有
|
|
已发布版本、合法旧提交和未结束候选的工件引用。
|
|
|
|
升级前停止新维护写入、备份专用数据库与私有工件,并用独立迁移账号执行升级和
|
|
`uv run --locked alembic check`。既有登录角色继续绑定各自最小权限组,迁移账号不进入
|
|
运行服务配置。降级不作为丢弃候选或回滚一次发布的手段;含新语言/已引用数据时的
|
|
降级拒绝须先核对原因,不能清空历史来通过检查。账号 bootstrap/恢复步骤见
|
|
[维护运维说明](../../deploy/admin-problems.md)。
|
|
|
|
服务使用各自独立的普通 `LOGIN` 角色,分别加入对应权限组;登录角色不能拥有数据库/表、
|
|
不能加入迁移账号或其他高权限组,且必须为 `NOSUPERUSER NOCREATEDB NOCREATEROLE NOBYPASSRLS`。
|
|
初始迁移拒绝已有的高权限同名组和继承其他角色的同名组。应用启动时不运行 migration。
|
|
降级删除本项目业务表与触发器,保留权限组及操作方配置的登录账号,避免删除集群级身份。
|
|
|
|
发布是一次单向转换:先在事务内创建版本和连续测试点,再设置 `published_at`。
|
|
数据库触发器拒绝再次发布、修改已发布版本和追加/改写已发布测试点;评测通过复合外键
|
|
永久绑定 submission 的版本,当前 attempt 和用例成绩也由复合外键绑定同一评测及版本。
|
|
工件引用具有数据库生成的 `ready` 状态,引用存在时不能转为 `deleting` 或删除元数据。
|
|
|
|
真实数据库验收使用显式 `KF_OJ_TEST_POSTGRES` 管理连接。每个测试只创建和删除随机命名的
|
|
`kf_oj_test_*` 数据库,不清空已有业务库。例行无数据库测试会明确跳过这些验收;跳过不算通过。
|