1.0.487.sql 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. -- S8-STANDARD-DATASET-HARD-CUTOVER-1 · 步骤 2:删除 Legacy 取数体系的全部残留。
  2. --
  3. -- 最终架构(唯一路径):
  4. -- Data Platform → Governed Dataset → S8 Provider → Canonical Contract
  5. -- → Watch Rule → Evaluator → Detection → Exception
  6. -- S8 不维护物理数据源、不执行任意 SQL、不保留 Legacy Rule。
  7. --
  8. -- 本脚本是**破坏性**的,按依赖顺序执行。执行前的实测基线(2026-09-05):
  9. -- ado_s8_watch_rule : 134 行 = Legacy 132(data_access_mode IS NULL)+ Standard 2
  10. -- Legacy 中 enabled=1 : 1 行(id=86 RULE_S1_ORDER_DELIVERY_DUE_GRAY30_DATE_DELAY)
  11. -- ado_s8_data_source : 3 行(无 FK / 无触发器 / 无视图 / 除 PRIMARY 无索引)
  12. -- Legacy 规则的运行产物: detection_log 327 行、exception 34 行
  13. -- (34 条中 32 条状态 NEW 从未被认领,2 条为 UAT 测试单;
  14. -- 40 条 timeline ≈ 每单 1.2 条,即仅创建事件,无真实处理链)
  15. --
  16. -- ⚠️ 判定 Legacy 用「非 STANDARD_DATASET」补集写法,且必须显式写 IS NULL:
  17. -- `data_access_mode <> 'STANDARD_DATASET'` 对 NULL 求值为 UNKNOWN,
  18. -- 会漏掉全部 132 条历史行。这是本脚本最容易写错的一处。
  19. -- 补集写法同时覆盖脏值(如 'SQL'),与代码侧「非 STANDARD 即无运行资格」对齐。
  20. --
  21. -- ⚠️⚠️ rule_code 跨租户重名,且 Rule 01 正在其中:
  22. -- RULE_S4_PURCHASE_DELIVERY_DATE_DELAY 同时存在于
  23. -- id=46(租户 797403760988230,Legacy)
  24. -- id=144(租户 838257237606469,Legacy)
  25. -- id=1329909460023(租户 838257186181189,STANDARD_DATASET ← Rule 01,必须保留)
  26. -- 而 ado_s8_rule_detection_state **只有 rule_code、没有 rule_id**。
  27. -- 因此凡按 rule_code 定位的删除,一律附加 (tenant_id, factory_id) 限定,
  28. -- 绝不允许出现裸 `WHERE rule_code = ...`。
  29. --
  30. -- 保留:Rule 01(1329909460023)与诊断规则(1329909460024),
  31. -- 两者均为 STANDARD_DATASET / PURCHASE_DELIVERY / enabled=0,本脚本不触碰。
  32. --
  33. -- 幂等:DELETE 带条件、DROP 带 IF EXISTS、ALTER 前查 information_schema。
  34. -- 重复执行影响行数为 0。
  35. -- ────────────────────────────────────────────────────────────────────────────
  36. -- 0. 固定 Legacy 规则 id 集合(后续步骤全部引用它,避免各步判定漂移)
  37. -- ────────────────────────────────────────────────────────────────────────────
  38. DROP TEMPORARY TABLE IF EXISTS tmp_s8_legacy_rule;
  39. CREATE TEMPORARY TABLE tmp_s8_legacy_rule AS
  40. SELECT id, tenant_id, factory_id, rule_code
  41. FROM ado_s8_watch_rule
  42. WHERE data_access_mode IS NULL
  43. OR TRIM(data_access_mode) = ''
  44. OR UPPER(TRIM(data_access_mode)) <> 'STANDARD_DATASET';
  45. -- ────────────────────────────────────────────────────────────────────────────
  46. -- 1. Legacy 规则产生的异常单及其子表
  47. -- 无 FK,必须手工按父子顺序删;子表一律经 exception_id 关联。
  48. -- ────────────────────────────────────────────────────────────────────────────
  49. DROP TEMPORARY TABLE IF EXISTS tmp_s8_legacy_exception;
  50. CREATE TEMPORARY TABLE tmp_s8_legacy_exception AS
  51. SELECT e.id FROM ado_s8_exception e
  52. JOIN tmp_s8_legacy_rule r ON r.id = e.source_rule_id;
  53. DELETE t FROM ado_s8_exception_timeline t JOIN tmp_s8_legacy_exception x ON x.id = t.exception_id;
  54. DELETE d FROM ado_s8_decision_record d JOIN tmp_s8_legacy_exception x ON x.id = d.exception_id;
  55. DELETE v FROM ado_s8_evidence v JOIN tmp_s8_legacy_exception x ON x.id = v.exception_id;
  56. DELETE n FROM ado_s8_notification_log n JOIN tmp_s8_legacy_exception x ON x.id = n.exception_id;
  57. DELETE e FROM ado_s8_exception e JOIN tmp_s8_legacy_exception x ON x.id = e.id;
  58. -- ────────────────────────────────────────────────────────────────────────────
  59. -- 2. Legacy 规则的检测轨迹与抗抖状态
  60. -- detection_log 有 rule_id,可精确关联;
  61. -- rule_detection_state 只有 rule_code,故必须三键(tenant + factory + code)限定 ——
  62. -- 否则会连带删掉 Rule 01 的抗抖状态(见文件头的重名说明)。
  63. -- ────────────────────────────────────────────────────────────────────────────
  64. DELETE d FROM ado_s8_detection_log d JOIN tmp_s8_legacy_rule r ON r.id = d.rule_id;
  65. DELETE s FROM ado_s8_rule_detection_state s
  66. JOIN tmp_s8_legacy_rule r
  67. ON r.tenant_id = s.tenant_id
  68. AND r.factory_id = s.factory_id
  69. AND r.rule_code = s.rule_code;
  70. -- ────────────────────────────────────────────────────────────────────────────
  71. -- 3. Legacy 规则本体
  72. -- ────────────────────────────────────────────────────────────────────────────
  73. DELETE w FROM ado_s8_watch_rule w JOIN tmp_s8_legacy_rule r ON r.id = w.id;
  74. DROP TEMPORARY TABLE IF EXISTS tmp_s8_legacy_exception;
  75. DROP TEMPORARY TABLE IF EXISTS tmp_s8_legacy_rule;
  76. -- ────────────────────────────────────────────────────────────────────────────
  77. -- 4. 规则表的 Legacy 列
  78. -- 必须在第 3 步之后:data_access_mode 正是第 0 步的判定依据。
  79. -- 用 information_schema 预检使脚本可重复执行(MySQL 的 DROP COLUMN 无 IF EXISTS)。
  80. -- ────────────────────────────────────────────────────────────────────────────
  81. SET @sql := (
  82. SELECT IF(COUNT(*) > 0, 'ALTER TABLE ado_s8_watch_rule DROP COLUMN data_source_id', 'DO 0')
  83. FROM information_schema.COLUMNS
  84. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'ado_s8_watch_rule' AND COLUMN_NAME = 'data_source_id');
  85. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  86. SET @sql := (
  87. SELECT IF(COUNT(*) > 0, 'ALTER TABLE ado_s8_watch_rule DROP COLUMN expression', 'DO 0')
  88. FROM information_schema.COLUMNS
  89. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'ado_s8_watch_rule' AND COLUMN_NAME = 'expression');
  90. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  91. SET @sql := (
  92. SELECT IF(COUNT(*) > 0, 'ALTER TABLE ado_s8_watch_rule DROP COLUMN data_access_mode', 'DO 0')
  93. FROM information_schema.COLUMNS
  94. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'ado_s8_watch_rule' AND COLUMN_NAME = 'data_access_mode');
  95. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  96. -- ────────────────────────────────────────────────────────────────────────────
  97. -- 5. 数据源整表
  98. -- 该表 endpoint 列存的是含凭据的真实连接串;S8 已不再维护物理连接,直接删除。
  99. -- ────────────────────────────────────────────────────────────────────────────
  100. DROP TABLE IF EXISTS ado_s8_data_source;
  101. -- ────────────────────────────────────────────────────────────────────────────
  102. -- 6. 菜单与授权
  103. -- 先清 SysRoleMenu 授权行,再删菜单,避免留下悬挂授权。
  104. -- 「维护数据源」按钮权限点(s8:config:data-source)一并清除;
  105. -- 目录侧保留一条 Deprecated 墓碑,防止该码被复用。
  106. -- ────────────────────────────────────────────────────────────────────────────
  107. DELETE rm FROM SysRoleMenu rm
  108. JOIN SysMenu m ON m.Id = rm.MenuId
  109. WHERE m.Name = 'aidopS8DataSourceConfig'
  110. OR m.Permission = 's8:config:data-source';
  111. DELETE FROM SysMenu
  112. WHERE Name = 'aidopS8DataSourceConfig'
  113. OR Permission = 's8:config:data-source';