dispatch_refactor_drop.sql 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. -- =====================================================================
  2. -- 应急与指挥调度模块改造 · 旧对象下线脚本(确认后执行)
  3. -- =====================================================================
  4. -- 文件:dispatch_refactor_drop.sql
  5. -- 用途:删除改造后不再使用的 13 张旧表,并清理 dis_event / dis_event_grade
  6. -- 上已被新列取代的废弃列。
  7. --
  8. -- ⚠️ 执行前置条件(缺一不可):
  9. -- 1) 已执行 dispatch_refactor.sql (建新表 + 字典 seed)
  10. -- 2) 已执行 dispatch_refactor_migrate.sql (旧数据搬迁到新结构)
  11. -- 3) 业务验证通过:接报 / 初判核实 / 转接报送 / 跟踪解除 / 工作催办
  12. -- / 事件分级 / 预案编辑 / 预案审批 八个页面读写正常
  13. -- 4) 已对 app_user schema 做完整备份(pg_dump -n app_user)
  14. --
  15. -- ⚠️⚠️ 顺序颠倒的后果(真发生过,必读):
  16. -- 若本脚本早于 migrate 执行,被删掉的旧表 / 旧列正是 migrate 的**唯一数据来源**。
  17. -- 之后 migrate 里所有搬迁块的 `to_regclass(...) IS NOT NULL` 判断都会为假而**静默跳过**,
  18. -- 脚本照常显示"成功",但什么都没搬进来 —— 且**不可重跑补救**:
  19. -- · 事件日志(dis_event_transfer_log / track_log / urge_detail)内容永久丢失;
  20. -- · dis_event_grade 的 category / level 值永久丢失(migrate 4.1 再无列可读);
  21. -- · 预案(dis_event_plan / dis_plan_approval)无法搬入。
  22. -- 唯一挽回途径是执行前的 pg_dump 备份。
  23. -- 执行本脚本前请先跑一遍 dispatch_refactor_migrate.sql 开头的「零、前置体检」,
  24. -- 确认输出是 NOTICE 而不是 WARNING。
  25. --
  26. -- 本脚本只做「删除」与「清列」,不建任何对象;
  27. -- 全部语句幂等,可重复执行;已通过 to_regclass / information_schema.columns 做前置校验,
  28. -- 新列 / 新表不存在时不会执行对应删除,避免误删未迁移的数据。
  29. -- (自检段刻意避开 information_schema.tables:部分 KingbaseES 实例上该视图会调
  30. -- sys_freespace(relid),普通业务账号无该函数权限,会误报权限错误。)
  31. --
  32. -- ⚠️ 方言红线(本实例实测):**不要用 `||` 做字符串拼接**。
  33. -- 本实例 KingbaseES 为 MySQL 兼容语义,`||` 是逻辑或(boolean OR),
  34. -- `'app_user.' || t.table_name` 会得到 boolean 而不是 'app_user.xxx'。
  35. -- 拼接一律用 concat(a, b)。详见 dispatch_refactor_migrate.sql 文件头「方言红线」。
  36. --
  37. -- 表对应关系(旧 → 新):
  38. -- dis_event_report / dis_event_verify / dis_event_transfer /
  39. -- dis_event_transfer_log / dis_event_track / dis_event_track_log /
  40. -- dis_event_urge / dis_event_urge_detail / dis_event_record
  41. -- → 事件主表 dis_event(当前值) + 事件日志 dis_event_log(过程留痕)
  42. -- dis_event_plan / dis_plan_approval / dis_plan_approval_step
  43. -- → 预案主表 dis_plan + 版本快照 dis_plan_version + 操作日志 dis_plan_log
  44. -- dis_plan_category
  45. -- → 预案分类并入字典 dis_plan_type,不再单独建表
  46. --
  47. -- 保留不动:dis_event、dis_event_grade、dis_event_assess、
  48. -- dis_plan_library、dis_plan_match_record
  49. --
  50. -- 作者:zengy 日期:2026-10-14
  51. -- =====================================================================
  52. BEGIN;
  53. -- ---------------------------------------------------------------------
  54. -- 一、删除事件域旧表(9 张)
  55. -- 前置校验:dis_event_log 必须已存在
  56. -- ---------------------------------------------------------------------
  57. DO $$
  58. BEGIN
  59. IF to_regclass('app_user.dis_event_log') IS NULL THEN
  60. RAISE EXCEPTION '未找到 app_user.dis_event_log,请先执行 dispatch_refactor.sql 与 dispatch_refactor_migrate.sql';
  61. END IF;
  62. END $$;
  63. DROP TABLE IF EXISTS app_user.dis_event_report;
  64. DROP TABLE IF EXISTS app_user.dis_event_verify;
  65. DROP TABLE IF EXISTS app_user.dis_event_transfer;
  66. DROP TABLE IF EXISTS app_user.dis_event_transfer_log;
  67. DROP TABLE IF EXISTS app_user.dis_event_track;
  68. DROP TABLE IF EXISTS app_user.dis_event_track_log;
  69. DROP TABLE IF EXISTS app_user.dis_event_urge;
  70. DROP TABLE IF EXISTS app_user.dis_event_urge_detail;
  71. DROP TABLE IF EXISTS app_user.dis_event_record;
  72. -- ---------------------------------------------------------------------
  73. -- 二、删除预案域旧表(4 张)
  74. -- 前置校验:dis_plan 必须已存在
  75. -- ---------------------------------------------------------------------
  76. DO $$
  77. BEGIN
  78. IF to_regclass('app_user.dis_plan') IS NULL OR to_regclass('app_user.dis_plan_log') IS NULL THEN
  79. RAISE EXCEPTION '未找到 app_user.dis_plan / dis_plan_log,请先执行 dispatch_refactor.sql 与 dispatch_refactor_migrate.sql';
  80. END IF;
  81. END $$;
  82. DROP TABLE IF EXISTS app_user.dis_event_plan;
  83. DROP TABLE IF EXISTS app_user.dis_plan_approval;
  84. DROP TABLE IF EXISTS app_user.dis_plan_approval_step;
  85. DROP TABLE IF EXISTS app_user.dis_plan_category;
  86. -- ---------------------------------------------------------------------
  87. -- 三、清理 dis_event 上已被新列取代的废弃列
  88. -- 仅当对应新列已存在时才删除,防止未迁移先删列
  89. -- ---------------------------------------------------------------------
  90. -- 3.1 事件来源:source → event_source
  91. DO $$
  92. BEGIN
  93. IF EXISTS (SELECT 1 FROM information_schema.columns
  94. WHERE table_schema = 'app_user' AND table_name = 'dis_event' AND column_name = 'event_source')
  95. AND EXISTS (SELECT 1 FROM information_schema.columns
  96. WHERE table_schema = 'app_user' AND table_name = 'dis_event' AND column_name = 'source') THEN
  97. EXECUTE 'ALTER TABLE app_user.dis_event DROP COLUMN IF EXISTS source';
  98. END IF;
  99. END $$;
  100. -- 3.2 事件类别:category → event_category
  101. DO $$
  102. BEGIN
  103. IF EXISTS (SELECT 1 FROM information_schema.columns
  104. WHERE table_schema = 'app_user' AND table_name = 'dis_event' AND column_name = 'event_category')
  105. AND EXISTS (SELECT 1 FROM information_schema.columns
  106. WHERE table_schema = 'app_user' AND table_name = 'dis_event' AND column_name = 'category') THEN
  107. EXECUTE 'ALTER TABLE app_user.dis_event DROP COLUMN IF EXISTS category';
  108. END IF;
  109. END $$;
  110. -- 3.3 事件等级:level → event_level(顺带去掉保留字转义)
  111. DO $$
  112. BEGIN
  113. IF EXISTS (SELECT 1 FROM information_schema.columns
  114. WHERE table_schema = 'app_user' AND table_name = 'dis_event' AND column_name = 'event_level')
  115. AND EXISTS (SELECT 1 FROM information_schema.columns
  116. WHERE table_schema = 'app_user' AND table_name = 'dis_event' AND column_name = 'level') THEN
  117. EXECUTE 'ALTER TABLE app_user.dis_event DROP COLUMN IF EXISTS "level"';
  118. END IF;
  119. END $$;
  120. -- 3.4 发生区域:region → event_region
  121. DO $$
  122. BEGIN
  123. IF EXISTS (SELECT 1 FROM information_schema.columns
  124. WHERE table_schema = 'app_user' AND table_name = 'dis_event' AND column_name = 'event_region')
  125. AND EXISTS (SELECT 1 FROM information_schema.columns
  126. WHERE table_schema = 'app_user' AND table_name = 'dis_event' AND column_name = 'region') THEN
  127. EXECUTE 'ALTER TABLE app_user.dis_event DROP COLUMN IF EXISTS region';
  128. END IF;
  129. END $$;
  130. -- 3.5 解除说明:close_remark → release_note(名称与语义统一为「解除」)
  131. DO $$
  132. BEGIN
  133. IF EXISTS (SELECT 1 FROM information_schema.columns
  134. WHERE table_schema = 'app_user' AND table_name = 'dis_event' AND column_name = 'release_note')
  135. AND EXISTS (SELECT 1 FROM information_schema.columns
  136. WHERE table_schema = 'app_user' AND table_name = 'dis_event' AND column_name = 'close_remark') THEN
  137. EXECUTE 'ALTER TABLE app_user.dis_event DROP COLUMN IF EXISTS close_remark';
  138. END IF;
  139. END $$;
  140. -- 3.6 无替代列的废弃字段:事件名称(改用 description)、初判时间(改用 verify_time)、
  141. -- 应用预案名称(改名走 dis_plan.plan_name 关联)、关闭环节(取消「已关闭」状态)
  142. ALTER TABLE app_user.dis_event DROP COLUMN IF EXISTS event_name;
  143. ALTER TABLE app_user.dis_event DROP COLUMN IF EXISTS judge_time;
  144. ALTER TABLE app_user.dis_event DROP COLUMN IF EXISTS plan_name;
  145. ALTER TABLE app_user.dis_event DROP COLUMN IF EXISTS close_reason;
  146. ALTER TABLE app_user.dis_event DROP COLUMN IF EXISTS close_time;
  147. -- ---------------------------------------------------------------------
  148. -- 四、清理 dis_event_grade 上已被新列取代的废弃列
  149. -- ---------------------------------------------------------------------
  150. -- 4.1 事件类别:category → event_category
  151. DO $$
  152. BEGIN
  153. IF EXISTS (SELECT 1 FROM information_schema.columns
  154. WHERE table_schema = 'app_user' AND table_name = 'dis_event_grade' AND column_name = 'event_category')
  155. AND EXISTS (SELECT 1 FROM information_schema.columns
  156. WHERE table_schema = 'app_user' AND table_name = 'dis_event_grade' AND column_name = 'category') THEN
  157. EXECUTE 'ALTER TABLE app_user.dis_event_grade DROP COLUMN IF EXISTS category';
  158. END IF;
  159. END $$;
  160. -- 4.2 事件等级:level → event_level
  161. DO $$
  162. BEGIN
  163. IF EXISTS (SELECT 1 FROM information_schema.columns
  164. WHERE table_schema = 'app_user' AND table_name = 'dis_event_grade' AND column_name = 'event_level')
  165. AND EXISTS (SELECT 1 FROM information_schema.columns
  166. WHERE table_schema = 'app_user' AND table_name = 'dis_event_grade' AND column_name = 'level') THEN
  167. EXECUTE 'ALTER TABLE app_user.dis_event_grade DROP COLUMN IF EXISTS "level"';
  168. END IF;
  169. END $$;
  170. COMMIT;
  171. -- =====================================================================
  172. -- 五、执行后自检(只读,结果自行核对)
  173. -- =====================================================================
  174. -- 说明:自检统一用 to_regclass(),不查 information_schema.tables。
  175. -- 部分 KingbaseES 实例的 information_schema.tables 视图会走到
  176. -- sys_freespace(relid),普通业务账号没有该函数的 EXECUTE 权限,
  177. -- 会报「对函数 sys_freespace 权限不够」,与本次 DDL 结果无关。
  178. -- 5.1 确认 13 张旧表已全部不存在(期望 13 行,still_exists 全为 NULL)
  179. SELECT t.table_name,
  180. to_regclass(concat('app_user.', t.table_name)) AS still_exists
  181. FROM (VALUES
  182. ('dis_event_report'), ('dis_event_verify'), ('dis_event_transfer'),
  183. ('dis_event_transfer_log'), ('dis_event_track'), ('dis_event_track_log'),
  184. ('dis_event_urge'), ('dis_event_urge_detail'), ('dis_event_record'),
  185. ('dis_event_plan'), ('dis_plan_approval'), ('dis_plan_approval_step'),
  186. ('dis_plan_category')
  187. ) AS t(table_name);
  188. -- 5.2 确认 4 张新表存在(期望 4 行,exists 全为 true)
  189. SELECT t.table_name,
  190. to_regclass(concat('app_user.', t.table_name)) IS NOT NULL AS exists
  191. FROM (VALUES
  192. ('dis_event_log'), ('dis_plan'), ('dis_plan_version'), ('dis_plan_log')
  193. ) AS t(table_name);
  194. -- 5.3 确认 dis_event 上不再有废弃列(期望返回 0 行)
  195. SELECT column_name
  196. FROM information_schema.columns
  197. WHERE table_schema = 'app_user' AND table_name = 'dis_event'
  198. AND column_name IN ('source', 'category', 'level', 'region', 'event_name',
  199. 'judge_time', 'plan_name', 'close_reason', 'close_remark', 'close_time')
  200. ORDER BY column_name;
  201. -- =====================================================================
  202. -- 六、菜单核对(只读)
  203. -- =====================================================================
  204. -- 本次改造只替换前端页面的数据层,8 个页面路径与组件位置均未变动,
  205. -- 因此 sys_menu 一般无需调整。若历史菜单中残留指向已下线页面的条目,
  206. -- 可先用下面的查询定位(菜单表实际名称以库内为准):
  207. --
  208. -- SELECT menu_id, menu_name, path, component, perms
  209. -- FROM sys.sys_menu
  210. -- WHERE component LIKE '%dispatch%'
  211. -- ORDER BY parent_id, order_num;
  212. --
  213. -- 确认某条菜单确实要下线后,再自行执行定向删除(本脚本不代删,避免误伤):
  214. --
  215. -- DELETE FROM sys.sys_role_menu WHERE menu_id = <menu_id>;
  216. -- DELETE FROM sys.sys_menu WHERE menu_id = <menu_id>;
  217. -- =====================================================================