gongxiangp2/prisma/migrations/product_package_migration.sql
2026-05-07 16:37:22 +08:00

108 lines
4.0 KiB
SQL

-- 产品全案素材类型 - 数据库迁移脚本
-- 执行前请先备份数据库!
-- 1. Material 表新增字段
ALTER TABLE "materials" ADD COLUMN IF NOT EXISTS "task_no" TEXT;
ALTER TABLE "materials" ADD COLUMN IF NOT EXISTS "task_status" TEXT;
ALTER TABLE "materials" ADD COLUMN IF NOT EXISTS "task_fetched_at" TIMESTAMP(3);
-- 创建唯一索引(如果不存在)
CREATE UNIQUE INDEX IF NOT EXISTS "materials_task_no_key" ON "materials"("task_no") WHERE "task_no" IS NOT NULL;
-- 创建普通索引
CREATE INDEX IF NOT EXISTS "materials_task_no_idx" ON "materials"("task_no");
CREATE INDEX IF NOT EXISTS "materials_task_status_idx" ON "materials"("task_status");
-- 2. DepartmentMaterialPermission 表新增字段
ALTER TABLE "department_material_permissions" ADD COLUMN IF NOT EXISTS "can_download_source" BOOLEAN NOT NULL DEFAULT false;
-- 3. 创建 MaterialAsset 表
CREATE TABLE IF NOT EXISTS "material_assets" (
"id" TEXT NOT NULL,
"material_id" TEXT NOT NULL,
"asset_type" TEXT NOT NULL,
"file_url" TEXT NOT NULL,
"file_name" TEXT,
"file_size" BIGINT NOT NULL DEFAULT 0,
"sort_order" INTEGER NOT NULL DEFAULT 0,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "material_assets_pkey" PRIMARY KEY ("id")
);
-- 创建索引
CREATE INDEX IF NOT EXISTS "material_assets_material_id_idx" ON "material_assets"("material_id");
CREATE INDEX IF NOT EXISTS "material_assets_asset_type_idx" ON "material_assets"("asset_type");
CREATE INDEX IF NOT EXISTS "material_assets_sort_order_idx" ON "material_assets"("sort_order");
-- 添加外键约束(如果不存在)
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.table_constraints
WHERE constraint_schema = 'public'
AND table_name = 'material_assets'
AND constraint_name = 'material_assets_material_id_fkey'
) THEN
ALTER TABLE "material_assets" ADD CONSTRAINT "material_assets_material_id_fkey"
FOREIGN KEY ("material_id") REFERENCES "materials"("id") ON DELETE CASCADE ON UPDATE CASCADE;
END IF;
END $$;
-- 4. 创建 ApiKey 表
CREATE TABLE IF NOT EXISTS "api_keys" (
"id" TEXT NOT NULL,
"name" TEXT NOT NULL,
"key" TEXT NOT NULL,
"is_active" BOOLEAN NOT NULL DEFAULT true,
"created_by" TEXT NOT NULL,
"last_used_at" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "api_keys_pkey" PRIMARY KEY ("id")
);
-- 创建唯一索引
CREATE UNIQUE INDEX IF NOT EXISTS "api_keys_key_key" ON "api_keys"("key");
CREATE INDEX IF NOT EXISTS "api_keys_key_idx" ON "api_keys"("key");
CREATE INDEX IF NOT EXISTS "api_keys_is_active_idx" ON "api_keys"("is_active");
-- 5. 创建 ApiCallLog 表
CREATE TABLE IF NOT EXISTS "api_call_logs" (
"id" TEXT NOT NULL,
"api_key_id" TEXT NOT NULL,
"endpoint" TEXT NOT NULL,
"method" TEXT NOT NULL,
"task_no" TEXT,
"status_code" INTEGER NOT NULL,
"duration" INTEGER NOT NULL,
"ip_address" TEXT,
"user_agent" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "api_call_logs_pkey" PRIMARY KEY ("id")
);
-- 创建索引
CREATE INDEX IF NOT EXISTS "api_call_logs_api_key_id_idx" ON "api_call_logs"("api_key_id");
CREATE INDEX IF NOT EXISTS "api_call_logs_task_no_idx" ON "api_call_logs"("task_no");
CREATE INDEX IF NOT EXISTS "api_call_logs_created_at_idx" ON "api_call_logs"("created_at");
-- 添加外键约束(如果不存在)
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.table_constraints
WHERE constraint_schema = 'public'
AND table_name = 'api_call_logs'
AND constraint_name = 'api_call_logs_api_key_id_fkey'
) THEN
ALTER TABLE "api_call_logs" ADD CONSTRAINT "api_call_logs_api_key_id_fkey"
FOREIGN KEY ("api_key_id") REFERENCES "api_keys"("id") ON DELETE CASCADE ON UPDATE CASCADE;
END IF;
END $$;
-- 完成
SELECT '产品全案数据库迁移完成' as message;