数据库迁移模式技能Skill migration-patterns

本技能用于数据库迁移创建,强制实施行级安全(RLS)策略和ARCHitect批准工作流,确保数据库迁移过程中的安全和合规性。适用于开发者在创建迁移、添加表或更新Prisma模式时遵循最佳实践。关键词:数据库迁移、RLS、安全、批准工作流、Prisma、DevOps、数据工程。

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

名称: 迁移模式 描述: 数据库迁移创建,强制实施行级安全(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