-- ===================================================================== -- 应急与指挥调度模块改造 · 旧对象下线脚本(确认后执行) -- ===================================================================== -- 文件:dispatch_refactor_drop.sql -- 用途:删除改造后不再使用的 13 张旧表,并清理 dis_event / dis_event_grade -- 上已被新列取代的废弃列。 -- -- ⚠️ 执行前置条件(缺一不可): -- 1) 已执行 dispatch_refactor.sql (建新表 + 字典 seed) -- 2) 已执行 dispatch_refactor_migrate.sql (旧数据搬迁到新结构) -- 3) 业务验证通过:接报 / 初判核实 / 转接报送 / 跟踪解除 / 工作催办 -- / 事件分级 / 预案编辑 / 预案审批 八个页面读写正常 -- 4) 已对 app_user schema 做完整备份(pg_dump -n app_user) -- -- ⚠️⚠️ 顺序颠倒的后果(真发生过,必读): -- 若本脚本早于 migrate 执行,被删掉的旧表 / 旧列正是 migrate 的**唯一数据来源**。 -- 之后 migrate 里所有搬迁块的 `to_regclass(...) IS NOT NULL` 判断都会为假而**静默跳过**, -- 脚本照常显示"成功",但什么都没搬进来 —— 且**不可重跑补救**: -- · 事件日志(dis_event_transfer_log / track_log / urge_detail)内容永久丢失; -- · dis_event_grade 的 category / level 值永久丢失(migrate 4.1 再无列可读); -- · 预案(dis_event_plan / dis_plan_approval)无法搬入。 -- 唯一挽回途径是执行前的 pg_dump 备份。 -- 执行本脚本前请先跑一遍 dispatch_refactor_migrate.sql 开头的「零、前置体检」, -- 确认输出是 NOTICE 而不是 WARNING。 -- -- 本脚本只做「删除」与「清列」,不建任何对象; -- 全部语句幂等,可重复执行;已通过 to_regclass / information_schema.columns 做前置校验, -- 新列 / 新表不存在时不会执行对应删除,避免误删未迁移的数据。 -- (自检段刻意避开 information_schema.tables:部分 KingbaseES 实例上该视图会调 -- sys_freespace(relid),普通业务账号无该函数权限,会误报权限错误。) -- -- ⚠️ 方言红线(本实例实测):**不要用 `||` 做字符串拼接**。 -- 本实例 KingbaseES 为 MySQL 兼容语义,`||` 是逻辑或(boolean OR), -- `'app_user.' || t.table_name` 会得到 boolean 而不是 'app_user.xxx'。 -- 拼接一律用 concat(a, b)。详见 dispatch_refactor_migrate.sql 文件头「方言红线」。 -- -- 表对应关系(旧 → 新): -- dis_event_report / dis_event_verify / dis_event_transfer / -- dis_event_transfer_log / dis_event_track / dis_event_track_log / -- dis_event_urge / dis_event_urge_detail / dis_event_record -- → 事件主表 dis_event(当前值) + 事件日志 dis_event_log(过程留痕) -- dis_event_plan / dis_plan_approval / dis_plan_approval_step -- → 预案主表 dis_plan + 版本快照 dis_plan_version + 操作日志 dis_plan_log -- dis_plan_category -- → 预案分类并入字典 dis_plan_type,不再单独建表 -- -- 保留不动:dis_event、dis_event_grade、dis_event_assess、 -- dis_plan_library、dis_plan_match_record -- -- 作者:zengy 日期:2026-10-14 -- ===================================================================== BEGIN; -- --------------------------------------------------------------------- -- 一、删除事件域旧表(9 张) -- 前置校验:dis_event_log 必须已存在 -- --------------------------------------------------------------------- DO $$ BEGIN IF to_regclass('app_user.dis_event_log') IS NULL THEN RAISE EXCEPTION '未找到 app_user.dis_event_log,请先执行 dispatch_refactor.sql 与 dispatch_refactor_migrate.sql'; END IF; END $$; DROP TABLE IF EXISTS app_user.dis_event_report; DROP TABLE IF EXISTS app_user.dis_event_verify; DROP TABLE IF EXISTS app_user.dis_event_transfer; DROP TABLE IF EXISTS app_user.dis_event_transfer_log; DROP TABLE IF EXISTS app_user.dis_event_track; DROP TABLE IF EXISTS app_user.dis_event_track_log; DROP TABLE IF EXISTS app_user.dis_event_urge; DROP TABLE IF EXISTS app_user.dis_event_urge_detail; DROP TABLE IF EXISTS app_user.dis_event_record; -- --------------------------------------------------------------------- -- 二、删除预案域旧表(4 张) -- 前置校验:dis_plan 必须已存在 -- --------------------------------------------------------------------- DO $$ BEGIN IF to_regclass('app_user.dis_plan') IS NULL OR to_regclass('app_user.dis_plan_log') IS NULL THEN RAISE EXCEPTION '未找到 app_user.dis_plan / dis_plan_log,请先执行 dispatch_refactor.sql 与 dispatch_refactor_migrate.sql'; END IF; END $$; DROP TABLE IF EXISTS app_user.dis_event_plan; DROP TABLE IF EXISTS app_user.dis_plan_approval; DROP TABLE IF EXISTS app_user.dis_plan_approval_step; DROP TABLE IF EXISTS app_user.dis_plan_category; -- --------------------------------------------------------------------- -- 三、清理 dis_event 上已被新列取代的废弃列 -- 仅当对应新列已存在时才删除,防止未迁移先删列 -- --------------------------------------------------------------------- -- 3.1 事件来源:source → event_source DO $$ BEGIN IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = 'app_user' AND table_name = 'dis_event' AND column_name = 'event_source') AND EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = 'app_user' AND table_name = 'dis_event' AND column_name = 'source') THEN EXECUTE 'ALTER TABLE app_user.dis_event DROP COLUMN IF EXISTS source'; END IF; END $$; -- 3.2 事件类别:category → event_category DO $$ BEGIN IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = 'app_user' AND table_name = 'dis_event' AND column_name = 'event_category') AND EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = 'app_user' AND table_name = 'dis_event' AND column_name = 'category') THEN EXECUTE 'ALTER TABLE app_user.dis_event DROP COLUMN IF EXISTS category'; END IF; END $$; -- 3.3 事件等级:level → event_level(顺带去掉保留字转义) DO $$ BEGIN IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = 'app_user' AND table_name = 'dis_event' AND column_name = 'event_level') AND EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = 'app_user' AND table_name = 'dis_event' AND column_name = 'level') THEN EXECUTE 'ALTER TABLE app_user.dis_event DROP COLUMN IF EXISTS "level"'; END IF; END $$; -- 3.4 发生区域:region → event_region DO $$ BEGIN IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = 'app_user' AND table_name = 'dis_event' AND column_name = 'event_region') AND EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = 'app_user' AND table_name = 'dis_event' AND column_name = 'region') THEN EXECUTE 'ALTER TABLE app_user.dis_event DROP COLUMN IF EXISTS region'; END IF; END $$; -- 3.5 解除说明:close_remark → release_note(名称与语义统一为「解除」) DO $$ BEGIN IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = 'app_user' AND table_name = 'dis_event' AND column_name = 'release_note') AND EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = 'app_user' AND table_name = 'dis_event' AND column_name = 'close_remark') THEN EXECUTE 'ALTER TABLE app_user.dis_event DROP COLUMN IF EXISTS close_remark'; END IF; END $$; -- 3.6 无替代列的废弃字段:事件名称(改用 description)、初判时间(改用 verify_time)、 -- 应用预案名称(改名走 dis_plan.plan_name 关联)、关闭环节(取消「已关闭」状态) ALTER TABLE app_user.dis_event DROP COLUMN IF EXISTS event_name; ALTER TABLE app_user.dis_event DROP COLUMN IF EXISTS judge_time; ALTER TABLE app_user.dis_event DROP COLUMN IF EXISTS plan_name; ALTER TABLE app_user.dis_event DROP COLUMN IF EXISTS close_reason; ALTER TABLE app_user.dis_event DROP COLUMN IF EXISTS close_time; -- --------------------------------------------------------------------- -- 四、清理 dis_event_grade 上已被新列取代的废弃列 -- --------------------------------------------------------------------- -- 4.1 事件类别:category → event_category DO $$ BEGIN IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = 'app_user' AND table_name = 'dis_event_grade' AND column_name = 'event_category') AND EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = 'app_user' AND table_name = 'dis_event_grade' AND column_name = 'category') THEN EXECUTE 'ALTER TABLE app_user.dis_event_grade DROP COLUMN IF EXISTS category'; END IF; END $$; -- 4.2 事件等级:level → event_level DO $$ BEGIN IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = 'app_user' AND table_name = 'dis_event_grade' AND column_name = 'event_level') AND EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = 'app_user' AND table_name = 'dis_event_grade' AND column_name = 'level') THEN EXECUTE 'ALTER TABLE app_user.dis_event_grade DROP COLUMN IF EXISTS "level"'; END IF; END $$; COMMIT; -- ===================================================================== -- 五、执行后自检(只读,结果自行核对) -- ===================================================================== -- 说明:自检统一用 to_regclass(),不查 information_schema.tables。 -- 部分 KingbaseES 实例的 information_schema.tables 视图会走到 -- sys_freespace(relid),普通业务账号没有该函数的 EXECUTE 权限, -- 会报「对函数 sys_freespace 权限不够」,与本次 DDL 结果无关。 -- 5.1 确认 13 张旧表已全部不存在(期望 13 行,still_exists 全为 NULL) SELECT t.table_name, to_regclass(concat('app_user.', t.table_name)) AS still_exists FROM (VALUES ('dis_event_report'), ('dis_event_verify'), ('dis_event_transfer'), ('dis_event_transfer_log'), ('dis_event_track'), ('dis_event_track_log'), ('dis_event_urge'), ('dis_event_urge_detail'), ('dis_event_record'), ('dis_event_plan'), ('dis_plan_approval'), ('dis_plan_approval_step'), ('dis_plan_category') ) AS t(table_name); -- 5.2 确认 4 张新表存在(期望 4 行,exists 全为 true) SELECT t.table_name, to_regclass(concat('app_user.', t.table_name)) IS NOT NULL AS exists FROM (VALUES ('dis_event_log'), ('dis_plan'), ('dis_plan_version'), ('dis_plan_log') ) AS t(table_name); -- 5.3 确认 dis_event 上不再有废弃列(期望返回 0 行) SELECT column_name FROM information_schema.columns WHERE table_schema = 'app_user' AND table_name = 'dis_event' AND column_name IN ('source', 'category', 'level', 'region', 'event_name', 'judge_time', 'plan_name', 'close_reason', 'close_remark', 'close_time') ORDER BY column_name; -- ===================================================================== -- 六、菜单核对(只读) -- ===================================================================== -- 本次改造只替换前端页面的数据层,8 个页面路径与组件位置均未变动, -- 因此 sys_menu 一般无需调整。若历史菜单中残留指向已下线页面的条目, -- 可先用下面的查询定位(菜单表实际名称以库内为准): -- -- SELECT menu_id, menu_name, path, component, perms -- FROM sys.sys_menu -- WHERE component LIKE '%dispatch%' -- ORDER BY parent_id, order_num; -- -- 确认某条菜单确实要下线后,再自行执行定向删除(本脚本不代删,避免误伤): -- -- DELETE FROM sys.sys_role_menu WHERE menu_id = ; -- DELETE FROM sys.sys_menu WHERE menu_id = ; -- =====================================================================