yeg
5 天以前 c4bb5bc9314ae5731ecae347c5aa11116ff1445e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
-- 开发模拟器产生的开发设备与开发数据 · 定点清理
-- ==========================================================================
-- 背景:开发模拟器(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 字段停止恢复(代码读到时只忽略),
-- 正式检测柜候选必须保留。
-- ==========================================================================