-- 开发模拟器产生的开发设备与开发数据 · 定点清理 -- ========================================================================== -- 背景:开发模拟器(dev-sim)已整体拆除,不再产生任何新数据;本脚本清理它此前产生的开发设备。 -- -- ⚠️ 脚本故意不给一条「整段执行」的路径。**先跑「一、先查」,按结果决定后面能做什么。** -- -- 关键事实:当前业务基线(`db/migration-final/V2__final_business_baseline.sql`)**没有外键约束** -- (全表 0 个 FOREIGN KEY,旧的 db/migration 已不作为 Flyway 位置)。所以删除设备行**不会被数据库拦下**, -- 悬空引用(例如实时记录还指着已删掉的通道)也不会报错——先查段是唯一防线。 -- -- 纪律(与 Ticket04「不影响已登记的正式设备、业务事实、审计记录与历史数据」一致): -- 1. **不整表 TRUNCATE、不按时间范围删除、不删审计/修订记录**,只按模拟器的固定身份处理: -- 适配器编码 `dev-sim`、采集器编码 `dev-sim-collector-N`。 -- 2. **能在产品页面上做的删除,先在页面上做**:检测柜与采集器的删除动作会走产品的引用校验与逻辑删除口径 -- (`del_flag`),本脚本不另造一条删除路径。本脚本的 SQL 删除只用于界面上已经没有入口的行 -- (例如代码装配时代留下的模拟器适配器行)。 -- 3. **绑定了模拟器通道的测试用「测试整体删除」清理**:ADR-0047 的明确无痕例外(一个事务清掉测试全部子数据、 -- 绑定、阈值与数据修订,不写日志与修订)。不要在这里直接 DELETE 测试行,那会留下指向测试的孤儿数据。 -- 4. 删除段只在**先查段的引用计数全为 0** 时执行,分步确认影响行数。有引用却先删了设备行, -- 那些引用就会变成悬空数据,而且没有任何报错提醒你。 -- 5. 执行前先停止 Spring Boot 后端(避免运行期把它重新写回)。 -- -- 交付说明:这些行是否存在取决于此前是否用模拟器登记过设备。先查段计数全为 0 就说明没有模拟器开发设备, -- 删除段即为空操作。 -- ========================================================================== -- 一、先查:确认要删什么、以及必须先经产品路径清掉的关联测试 -- -------------------------------------------------------------------------- -- 1.1 模拟器适配器行(ADR-0018:dev-sim 是代码装配、不写 t_device_adapter,所以这里通常为 0) SELECT COUNT(*) AS dev_sim_adapter_rows FROM t_device_adapter WHERE adapter_code = 'dev-sim'; -- 1.2 模拟器登记过的检测柜与通道 SELECT c.cabinet_id, c.cabinet_code, c.cabinet_name, c.adapter_id, c.del_flag FROM t_detection_cabinet c JOIN t_device_adapter a ON a.adapter_id = c.adapter_id WHERE a.adapter_code = 'dev-sim'; SELECT ch.channel_id, ch.cabinet_id, ch.devtype, ch.devid, ch.subdevid, ch.chlid, ch.del_flag FROM t_detection_channel ch JOIN t_detection_cabinet c ON c.cabinet_id = ch.cabinet_id JOIN t_device_adapter a ON a.adapter_id = c.adapter_id WHERE a.adapter_code = 'dev-sim'; -- 1.3 模拟器采集器 SELECT collector_id, collector_code, collector_name, adapter_id, del_flag FROM t_collector WHERE collector_code LIKE 'dev-sim-collector-%'; -- 1.4 **必须先清掉的关联测试**:下面四个计数都必须为 0,否则先按纪律第 2、3 条在界面上删除这些测试 -- (删除测试会一并清掉它的绑定、实时/工步/循环事实与采集器映射,也就解开了对设备行的引用) -- 1.4.1 绑定了模拟器通道的测试 SELECT DISTINCT t.test_id, t.test_name, t.test_status, t.reception_status FROM t_test t JOIN t_test_channel_binding b ON b.test_id = t.test_id JOIN t_detection_channel ch ON ch.channel_id = b.channel_id JOIN t_detection_cabinet c ON c.cabinet_id = ch.cabinet_id JOIN t_device_adapter a ON a.adapter_id = c.adapter_id WHERE a.adapter_code = 'dev-sim'; -- 1.4.2 仍指向模拟器通道的测试通道绑定 SELECT COUNT(*) AS binding_rows FROM t_test_channel_binding b JOIN t_detection_channel ch ON ch.channel_id = b.channel_id JOIN t_detection_cabinet c ON c.cabinet_id = ch.cabinet_id JOIN t_device_adapter a ON a.adapter_id = c.adapter_id WHERE a.adapter_code = 'dev-sim'; -- 1.4.3 仍指向模拟器设备或采集器的实时记录 SELECT COUNT(*) AS realtime_snapshot_rows FROM t_test_realtime_record r WHERE r.collector_id IN (SELECT collector_id FROM t_collector WHERE collector_code LIKE 'dev-sim-collector-%') OR (r.adapter_code = 'dev-sim'); -- 1.4.4 仍指向模拟器采集器的测试-采集器映射 SELECT COUNT(*) AS collector_mapping_rows FROM t_test_collector_channel m JOIN t_collector col ON col.collector_id = m.collector_id WHERE col.collector_code LIKE 'dev-sim-collector-%'; -- 二、删除:**仅当 1.4 的引用计数全为 0** 才执行;分步执行并确认影响行数 -- -------------------------------------------------------------------------- -- 2.1 模拟器通道(先删子表) DELETE ch FROM t_detection_channel ch JOIN t_detection_cabinet c ON c.cabinet_id = ch.cabinet_id JOIN t_device_adapter a ON a.adapter_id = c.adapter_id WHERE a.adapter_code = 'dev-sim'; -- 2.2 模拟器检测柜 DELETE c FROM t_detection_cabinet c JOIN t_device_adapter a ON a.adapter_id = c.adapter_id WHERE a.adapter_code = 'dev-sim'; -- 2.3 模拟器采集器(含已被页面逻辑删除的行) DELETE FROM t_collector WHERE collector_code LIKE 'dev-sim-collector-%'; -- 2.4 模拟器适配器行(若 1.1 计为 0,这一句是空操作) DELETE FROM t_device_adapter WHERE adapter_code = 'dev-sim'; -- ========================================================================== -- 三、Redis 里的模拟器状态(在 Redis 上执行,不在业务库里) -- -------------------------------------------------------------------------- -- 这些键是模拟器的运行状态,拆除后不再有人写它们: -- redis-cli DEL dev:bts-simulator:state:v1 -- redis-cli DEL dev:bts-simulator:recent-requests:v1 -- redis-cli DEL dev:bts-simulator:collector-history:v1 -- **不要删** dev:device-discovery:candidates:v1 —— 它是正式发现候选(RedisDeviceDiscoveryCandidateStore) -- 用的同一个键;模拟器时代写进去的采集器候选已随 collectors 字段停止恢复(代码读到时只忽略), -- 正式检测柜候选必须保留。 -- ==========================================================================