迁移模式技能Skill migration-patterns

本技能指导数据库迁移的创建,强制实施行级安全(RLS)策略,遵循安全优先的架构和审批工作流。适用于数据库迁移、添加带RLS的表、更新Prisma schema等场景,关键词包括数据库迁移、RLS、行级安全、Prisma、架构审批、DevOps。

DevOps 0 次安装 0 次浏览 更新于 3/15/2026

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