| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- -- 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;
- -- ============================================================================
|