名称: 迁移模式 描述: 数据库迁移创建,强制实施行级安全(RLS)策略和ARCHitect批准工作流。适用于创建迁移、添加带RLS的表或更新Prisma模式。
迁移模式技能
目的
指导数据库迁移创建,强制实施RLS策略,遵循安全优先架构和批准工作流。
适用时机
- 创建数据库迁移
- 添加新表(所有表需要RLS)
- 更新Prisma模式
- 添加GRANT语句
- 模式影响分析
- 数据迁移规划
停止条件
禁止模式
-- 禁止:RLS策略在单独文件中
-- RLS必须在与表创建相同的migration.sql文件中
-- 禁止:表无RLS
CREATE TABLE user_data (...);
-- 缺失:ALTER TABLE user_data ENABLE ROW LEVEL SECURITY;
-- 禁止:解析已应用的迁移
npx prisma migrate resolve --applied "migration_name"
-- 这会绕过迁移验证
-- 禁止:缺失user_id索引
CREATE TABLE payments (...);
-- 缺失:CREATE INDEX idx_payments_user_id ON payments(user_id);
-- 禁止:无ARCHitect批准的模式更改
-- 所有迁移在PR前需要批准
正确模式
-- 正确:完整迁移,RLS在同一文件中
CREATE TABLE user_data (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id TEXT NOT NULL,
data JSONB,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 启用RLS(同一文件 - 强制)
ALTER TABLE user_data ENABLE ROW LEVEL SECURITY;
-- 用户策略
CREATE POLICY user_data_user_select ON user_data
FOR SELECT TO {{PROJECT}}_app_user
USING (user_id = current_setting('app.current_user_id', true));
-- RLS性能索引(强制)
CREATE INDEX idx_user_data_user_id ON user_data(user_id);
-- 授权权限
GRANT SELECT, INSERT, UPDATE ON user_data TO {{PROJECT}}_app_user;
迁移工作流(强制)
步骤1:获取ARCHitect批准
在任何模式更改前:
1. 记录提议更改
2. 获取ARCHitect批准(创建问题或讨论)
3. 仅在有明确批准后继续
步骤2:创建迁移
# 生成迁移
npx prisma migrate dev --name 描述性名称
# 验证迁移文件创建
ls prisma/migrations/
步骤3:向迁移添加RLS
编辑生成的迁移以包括:
- [ ]
ALTER TABLE ... ENABLE ROW LEVEL SECURITY - [ ] 用户SELECT策略
- [ ] 用户INSERT策略(如适用)
- [ ] 用户UPDATE策略(如适用)
- [ ] 管理员策略(如需要)
- [ ] 系统策略(用于后台任务)
- [ ] user_id列上的索引
- [ ] GRANT语句
步骤4:本地验证
# 测试迁移
DATABASE_URL="..." npx prisma migrate dev
# 验证RLS已启用
psql -c "SELECT tablename, rowsecurity FROM pg_tables WHERE schemaname = 'public';"
步骤5:更新文档
迁移成功后:
- [ ] 更新
docs/database/DATA_DICTIONARY.md(强制) - [ ] 如果添加了新策略,更新RLS策略目录
- [ ] 在Linear票证中记录
RLS策略模板
用户读取策略
CREATE POLICY {table}_user_select ON {table}
FOR SELECT TO {{PROJECT}}_app_user
USING (user_id = current_setting('app.current_user_id', true));
用户写入策略
CREATE POLICY {table}_user_insert ON {table}
FOR INSERT TO {{PROJECT}}_app_user
WITH CHECK (user_id = current_setting('app.current_user_id', true));
管理员策略
CREATE POLICY {table}_admin_all ON {table}
FOR ALL TO {{PROJECT}}_app_user
USING (current_setting('app.user_role', true) = 'admin');
系统策略(后台任务)
CREATE POLICY {table}_system_all ON {table}
FOR ALL TO {{PROJECT}}_app_user
USING (current_setting('app.context_type', true) = 'system');
迁移清单
PR前:
- [ ] 已获得ARCHitect批准
- [ ] RLS策略在同一迁移文件中
- [ ] 用户策略已创建
- [ ] user_id索引已创建
- [ ] GRANT语句已添加
- [ ] 本地迁移测试通过
- [ ] DATA_DICTIONARY.md已更新
- [ ] 证据已附到Linear
生产迁移要求
对于生产迁移:
- [ ] 必须有操作员在场(强制)
- [ ] 迁移前备份已进行
- [ ] 回滚计划已文档化
- [ ] 迁移后验证步骤已定义
- [ ] 数据完整性检查已规划
参考
- 迁移SOP:
docs/database/RLS_DATABASE_MIGRATION_SOP.md(强制) - 数据字典:
docs/database/DATA_DICTIONARY.md(更改后更新) - RLS实现指南:
docs/database/RLS_IMPLEMENTATION_GUIDE.md - RLS策略目录:
docs/database/RLS_POLICY_CATALOG.md - 安全优先架构:
docs/guides/SECURITY_FIRST_ARCHITECTURE.md