name: migration-patterns 描述: 数据库迁移创建,强制实施RLS策略和ARCHitect审批工作流。适用于创建迁移、添加带RLS的表或更新Prisma schema时使用。
迁移模式技能
目的
指导数据库迁移创建,强制实施RLS策略,遵循安全优先的架构和审批工作流。
何时应用此技能
在以下情况下调用此技能:
- 创建数据库迁移
- 添加新表(所有表都需要RLS)
- 更新Prisma schema
- 添加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 descriptive_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
生产迁移要求
对于生产迁移:
- [ ] @{{AUTHOR_HANDLE}}必须存在(强制)
- [ ] 迁移前已备份
- [ ] 回滚计划已记录
- [ ] 迁移后验证步骤已定义
- [ ] 数据完整性检查已规划
权威参考
- 迁移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