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