iotsaas/backend/sql/V24__cleanup_orphan_tuya_devices.sql
2995840376 91d50eda91 fix(J): 清理孤儿涂鸦设备与测试联动数据, 解绑时联动失效设备与AI档案
数据层(V24 迁移): 逻辑删除无涂鸦绑定记录的孤儿涂鸦设备及其AI档案; 物理删除测试阶段的联动规则、场景与场景执行记录(条件相同但动作矛盾的测试数据); 保留产品/物模型/家庭/成员/活动日志。幂等可重复执行。

代码层(根治): TuyaCloudService.unbindUser 解绑时联动逻辑删除该用户的涂鸦设备与AI档案, 避免解绑后设备仍在列表被联动规则反复命中而刷错误日志; 采用逻辑删除, 用户重新绑定同步时 restoreById 自动恢复。
2026-10-27 21:56:45 +08:00

52 lines
2.6 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- =====================================================================
-- V24 · 清理测试阶段遗留的孤儿涂鸦设备与测试联动数据
-- ---------------------------------------------------------------------
-- 背景:
-- 1) unbindUser 早期只物理删除 tuya_user_binding 绑定记录,不处理已同步的设备,
-- 于是产生"孤儿涂鸦设备":设备仍在设备列表,却已无涂鸦账号可控制。
-- 定时场景每分钟命中的联动规则会持续对它们下发指令,全部失败并刷错误日志。
-- (代码侧已修复:解绑时联动逻辑删除设备与 AI 档案,重新绑定同步时自动恢复)
-- 2) 测试阶段遗留的联动规则与场景:条件全部相同(switch_1 == true)但动作互相矛盾
-- (switch_1=true / switch_1=0 / {"1":"open"} 混用 dpId),会下发自相矛盾的指令。
--
-- 清理范围:
-- - 逻辑删除孤儿涂鸦设备(owner 已无涂鸦绑定记录)
-- - 逻辑删除指向这些设备的 AI 档案
-- - 删除测试联动规则与测试场景(含每分钟 cron 的 bb 场景)
-- 保留:产品与物模型(product / product_property / product_event / product_action),
-- 家庭与成员、设备活动日志(历史审计)等。
--
-- 无存储过程、无 DELIMITER;幂等可重复执行。
-- =====================================================================
-- ---------- 1) 逻辑删除孤儿涂鸦设备 ----------
UPDATE device d
SET d.deleted = 1,
d.update_time = NOW()
WHERE d.deleted = 0
AND d.platform = 'tuya'
AND d.owner_id > 0
AND NOT EXISTS (SELECT 1 FROM tuya_user_binding b WHERE b.member_id = d.owner_id);
-- ---------- 2) 逻辑删除已解绑用户的 AI 档案 ----------
-- 注意:这里按 owner_id 判定,而不是 JOIN device 比较 device_id——
-- ai_device_profile.device_id 与 device.device_id 的排序规则不同
-- (utf8mb4_unicode_ci vs utf8mb4_0900_ai_ci),跨表字符串比较会报
-- ERROR 1267 Illegal mix of collations。owner_id 为数值列,无此问题。
UPDATE ai_device_profile a
SET a.deleted = 1,
a.update_time = NOW()
WHERE a.deleted = 0
AND a.owner_id > 0
AND NOT EXISTS (SELECT 1 FROM tuya_user_binding b WHERE b.member_id = a.owner_id);
-- ---------- 3) 删除测试联动规则 ----------
DELETE FROM linkage_rule WHERE deleted = 0;
-- ---------- 4) 删除测试场景(bb 场景 cron 为每分钟执行) ----------
DELETE FROM scene WHERE deleted = 0;
-- ---------- 5) 清理场景执行记录 ----------
DELETE FROM scene_run;