| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- -- =====================================================================
- -- 应急与指挥调度模块改造 · 旧对象下线脚本(确认后执行)
- -- =====================================================================
- -- 文件: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 = <menu_id>;
- -- DELETE FROM sys.sys_menu WHERE menu_id = <menu_id>;
- -- =====================================================================
|