108 lines
4.0 KiB
SQL
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;
|