You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Prisma迁移时,如何针对不同环境配置数据表操作规则?

Prisma迁移下区分生产/测试环境配置触发器的最佳实践

针对生产环境需禁止删改、测试环境允许操作的追加数据表需求,以下是几种实用的Prisma迁移方案:

方案1:迁移文件中嵌入环境变量条件判断(推荐)

Prisma支持在迁移SQL文件中使用环境变量进行条件执行,核心思路是仅在生产环境创建禁止删改的触发器。

操作步骤:

  1. 创建专门的触发器迁移文件(或在创建数据表的迁移文件末尾添加):
-- 定义禁止删改的函数
CREATE OR REPLACE FUNCTION prevent_update_delete()
RETURNS TRIGGER AS $$
BEGIN
  RAISE EXCEPTION '该表为仅追加表,不允许更新/删除操作';
END;
$$ LANGUAGE plpgsql;

-- 仅在生产环境创建触发器
${env:ENVIRONMENT = 'production'}
CREATE TRIGGER trigger_prevent_update
BEFORE UPDATE ON your_append_only_table
FOR EACH ROW EXECUTE FUNCTION prevent_update_delete();

CREATE TRIGGER trigger_prevent_delete
BEFORE DELETE ON your_append_only_table
FOR EACH ROW EXECUTE FUNCTION prevent_update_delete();
  1. 设置环境变量:
    • 生产环境:执行迁移时传入ENVIRONMENT=production prisma migrate deploy
    • 测试环境:使用任意非production值(如ENVIRONMENT=test prisma migrate deploy),此时触发器创建语句会被跳过

方案2:利用Seed脚本区分环境执行

如果不想在迁移文件中加入条件逻辑,可以通过Prisma的Seed脚本,仅在生产环境初始化触发器。

操作步骤:

  1. 在prisma/seed.ts中编写环境判断逻辑:
import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

async function main() {
  const env = process.env.NODE_ENV;
  if (env === 'production') {
    // 生产环境创建触发器
    await prisma.$executeRaw`
      CREATE OR REPLACE FUNCTION prevent_update_delete()
      RETURNS TRIGGER AS $$
      BEGIN
        RAISE EXCEPTION '该表为仅追加表,不允许更新/删除操作';
      END;
      $$ LANGUAGE plpgsql;

      CREATE TRIGGER trigger_prevent_update
      BEFORE UPDATE ON your_append_only_table
      FOR EACH ROW EXECUTE FUNCTION prevent_update_delete();

      CREATE TRIGGER trigger_prevent_delete
      BEFORE DELETE ON your_append_only_table
      FOR EACH ROW EXECUTE FUNCTION prevent_update_delete();
    `;
  }
}

main()
  .catch(e => {
    console.error(e);
    process.exit(1);
  })
  .finally(async () => {
    await prisma.$disconnect();
  });
  1. 执行流程:
    • 生产环境:prisma migrate deploy && prisma db seed
    • 测试环境:仅执行prisma migrate deploy,跳过Seed脚本(或Seed脚本自动跳过触发器创建)

注意事项

  • 确保环境变量在迁移/Seed执行时正确传递,避免测试环境误创建触发器
  • 生产环境需验证触发器生效:尝试更新/删除数据,确认抛出预期异常
  • 测试环境需验证操作权限:确保更新/删除操作可正常执行

内容的提问来源于stack exchange,提问作者Igor Loskutov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 20:15:34