-- 开发模拟器产生的开发设备与开发数据 · 定点清理
|
-- ==========================================================================
|
-- 背景:开发模拟器(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 字段停止恢复(代码读到时只忽略),
|
-- 正式检测柜候选必须保留。
|
-- ==========================================================================
|