1.0.328.sql 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. -- 1.0.328.sql S0:NbrTypeMaster.tenant_id → BIGINT NOT NULL(幂等 + 前置断言,绝不自动回填)。
  2. -- 背景:NbrTypeMaster 实体 AdoS0NbrTypeMaster 带 [IgnoreTable],CodeFirst 不管理其结构 → DDL 层的 NOT NULL 可持久(重启不被还原,已两次重启实证)。
  3. -- 现状 141 行(797:70 / 824:71),tenant_id 全真实租户、0 NULL、0 zero、0 system → 可安全硬化。
  4. -- 仅操作 NbrTypeMaster 一张表;不插入/更新/删除任何业务数据;不加任何 DEFAULT。
  5. -- 与 S0 收尾小批同批:ItemOpCondition / ItemSubstituteDetail 匿名写 tenant=0 P0 收口(纯 Controller,无 DDL)。
  6. -- ============================================================================
  7. -- 一、确认 tenant_id 列存在(缺列则全脚本 no-op)
  8. SET @has_col := (SELECT COUNT(*) FROM information_schema.COLUMNS
  9. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'NbrTypeMaster' AND COLUMN_NAME = 'tenant_id');
  10. -- 二、前置数据断言:存在 NULL 或 0 则中止(SIGNAL),绝不自动 UPDATE / 猜测 tenant
  11. SET @bad := IF(@has_col > 0,
  12. (SELECT COUNT(*) FROM NbrTypeMaster WHERE tenant_id IS NULL OR tenant_id = 0), 0);
  13. SELECT @bad AS nbrtype_null_or_zero; -- 期望 0
  14. SET @sql := IF(@has_col > 0 AND @bad > 0,
  15. "SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'NbrTypeMaster has NULL/0 tenant_id — abort NOT NULL hardening'",
  16. 'DO 0');
  17. PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
  18. -- 三、幂等 MODIFY NOT NULL(仅当列存在、数据干净、且当前仍 nullable 时执行)
  19. SET @is_nullable := (SELECT IS_NULLABLE FROM information_schema.COLUMNS
  20. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'NbrTypeMaster' AND COLUMN_NAME = 'tenant_id');
  21. SET @sql := IF(@has_col > 0 AND @bad = 0 AND @is_nullable = 'YES',
  22. 'ALTER TABLE NbrTypeMaster MODIFY COLUMN tenant_id BIGINT NOT NULL',
  23. 'DO 0');
  24. PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
  25. -- 四、剥离任何遗留 DEFAULT(保证最终态无 DEFAULT 0 / DEFAULT system)
  26. SET @has_default := (SELECT COUNT(*) FROM information_schema.COLUMNS
  27. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'NbrTypeMaster' AND COLUMN_NAME = 'tenant_id'
  28. AND COLUMN_DEFAULT IS NOT NULL);
  29. SET @sql := IF(@has_default > 0, 'ALTER TABLE NbrTypeMaster ALTER COLUMN tenant_id DROP DEFAULT', 'DO 0');
  30. PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
  31. -- 五、执行后验证
  32. SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT
  33. FROM information_schema.COLUMNS
  34. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'NbrTypeMaster' AND COLUMN_NAME = 'tenant_id';
  35. -- 期望:tenant_id bigint / IS_NULLABLE = NO / COLUMN_DEFAULT = NULL。
  36. -- ============================================================================
  37. -- 回滚 SQL(如需恢复可空,仅在确认无写入依赖非空时执行):
  38. -- ALTER TABLE NbrTypeMaster MODIFY COLUMN tenant_id BIGINT NULL;
  39. -- ============================================================================