Files
AIGC/demo/docs/task_status_cascade_trigger.sql

115 lines
5.1 KiB
MySQL
Raw Permalink Normal View History

-- ============================================
-- 任务状态级联更新触发器
--
-- 功能:当 task_status 表状态更新时,自动同步到:
-- - task_queue
-- - user_works
-- - text_to_video_tasks
-- - image_to_video_tasks
-- - storyboard_video_tasks
--
-- 执行方式:在 MySQL 客户端中执行此脚本
-- ============================================
-- 选择数据库
USE aigc_platform;
-- 先删除已存在的触发器
DROP TRIGGER IF EXISTS trg_task_status_update;
-- 修改分隔符
DELIMITER //
-- 创建触发器
-- 状态枚举说明:
-- task_status/task_queue: PENDING, PROCESSING, COMPLETED, FAILED, CANCELLED, TIMEOUT
-- user_works: PROCESSING, COMPLETED, FAILED, DELETED (缺少 PENDING, CANCELLED, TIMEOUT)
-- 业务表: PENDING, PROCESSING, COMPLETED, FAILED, CANCELLED (缺少 TIMEOUT)
--
-- 注意:分镜图(_image后缀)在task_status表中没有独立记录无需处理
CREATE TRIGGER trg_task_status_update
AFTER UPDATE ON task_status
FOR EACH ROW
BEGIN
IF NEW.status <> OLD.status THEN
-- 1. 更新 task_queue 表(状态枚举一致,直接同步)
UPDATE task_queue
SET status = NEW.status,
updated_at = NOW(),
error_message = CASE WHEN NEW.status IN ('FAILED', 'TIMEOUT') THEN NEW.error_message ELSE error_message END
WHERE task_id = NEW.task_id;
-- 2. 更新 user_works 表(需要状态映射)
-- PENDING -> PROCESSING, CANCELLED/TIMEOUT -> FAILED
UPDATE user_works
SET status = CASE
WHEN NEW.status IN ('PENDING', 'PROCESSING') THEN 'PROCESSING'
WHEN NEW.status = 'COMPLETED' THEN 'COMPLETED'
WHEN NEW.status IN ('FAILED', 'CANCELLED', 'TIMEOUT') THEN 'FAILED'
ELSE status
END,
updated_at = NOW(),
result_url = CASE WHEN NEW.status = 'COMPLETED' AND NEW.result_url IS NOT NULL THEN NEW.result_url ELSE result_url END
WHERE task_id = NEW.task_id;
-- 3. 更新业务任务表TIMEOUT 映射为 FAILED
-- 文生视频 (txt2vid_*)
IF NEW.task_id LIKE 'txt2vid_%' THEN
UPDATE text_to_video_tasks
SET status = CASE WHEN NEW.status = 'TIMEOUT' THEN 'FAILED' ELSE NEW.status END,
updated_at = NOW(),
progress = CASE WHEN NEW.status = 'COMPLETED' THEN 100 ELSE progress END,
completed_at = CASE WHEN NEW.status IN ('COMPLETED', 'FAILED', 'CANCELLED', 'TIMEOUT') THEN NOW() ELSE completed_at END,
error_message = CASE WHEN NEW.status IN ('FAILED', 'TIMEOUT') THEN COALESCE(NEW.error_message, '任务超时') ELSE error_message END,
result_url = CASE WHEN NEW.status = 'COMPLETED' AND NEW.result_url IS NOT NULL THEN NEW.result_url ELSE result_url END
WHERE task_id = NEW.task_id;
END IF;
-- 图生视频 (img2vid_*)
IF NEW.task_id LIKE 'img2vid_%' THEN
UPDATE image_to_video_tasks
SET status = CASE WHEN NEW.status = 'TIMEOUT' THEN 'FAILED' ELSE NEW.status END,
updated_at = NOW(),
progress = CASE WHEN NEW.status = 'COMPLETED' THEN 100 ELSE progress END,
completed_at = CASE WHEN NEW.status IN ('COMPLETED', 'FAILED', 'CANCELLED', 'TIMEOUT') THEN NOW() ELSE completed_at END,
error_message = CASE WHEN NEW.status IN ('FAILED', 'TIMEOUT') THEN COALESCE(NEW.error_message, '任务超时') ELSE error_message END,
result_url = CASE WHEN NEW.status = 'COMPLETED' AND NEW.result_url IS NOT NULL THEN NEW.result_url ELSE result_url END
WHERE task_id = NEW.task_id;
END IF;
-- 分镜视频 (storyboard_*)
IF NEW.task_id LIKE 'storyboard_%' THEN
UPDATE storyboard_video_tasks
SET status = CASE WHEN NEW.status = 'TIMEOUT' THEN 'FAILED' ELSE NEW.status END,
updated_at = NOW(),
progress = CASE WHEN NEW.status = 'COMPLETED' THEN 100 ELSE progress END,
completed_at = CASE WHEN NEW.status IN ('COMPLETED', 'FAILED', 'CANCELLED', 'TIMEOUT') THEN NOW() ELSE completed_at END,
error_message = CASE WHEN NEW.status IN ('FAILED', 'TIMEOUT') THEN COALESCE(NEW.error_message, '任务超时') ELSE error_message END,
result_url = CASE WHEN NEW.status = 'COMPLETED' AND NEW.result_url IS NOT NULL THEN NEW.result_url ELSE result_url END
WHERE task_id = NEW.task_id;
END IF;
END IF;
END//
-- 恢复分隔符
DELIMITER ;
-- 验证触发器已创建
SHOW TRIGGERS LIKE 'task_status';
-- ============================================
-- 使用说明:
--
-- 1. 连接到 MySQL 数据库
-- 2. 选择对应的数据库: USE your_database_name;
-- 3. 执行此脚本
--
-- 注意事项:
-- - 触发器会在 task_status 表的 status 字段更新时自动执行
-- - 确保所有表都有 task_id 字段作为关联键
-- - 状态值使用字符串存储(如 'COMPLETED', 'FAILED' 等)
-- ============================================