1.0.185.sql 5.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. -- ============================================================
  2. -- 1.0.185.sql
  3. -- S0-NBRTYPE-CREATE-RECID-SCHEMA-AND-DOMAINCODE-REQUIRED-FIX-1
  4. --
  5. -- 业务目标:修复 NbrTypeMaster(单号类型)合法新增对任意输入返回 500/S01999 的根因。
  6. -- NbrTypeMaster 表存在新旧两套列:业务真实数据落在旧 PascalCase 列(RecID / Domain / NbrType / IsActive 等);
  7. -- snake_case 列为历史 CodeFirst 阶段补加、当前 70 行业务列全空(rec_id=0 / domain_code='' / nbr_type='' / is_active=0)的孤立列。
  8. -- 实体 AdoS0NbrTypeMaster 仅映射 PascalCase 业务列 + 组织 snake 列(company_ref_id/factory_ref_id),
  9. -- 未映射孤立列 rec_id(bigint) / domain_code(varchar(50)) / nbr_type(varchar(100)) / is_active(tinyint(1))。
  10. -- 这 4 列为 NOT NULL 且无默认值,INSERT 时无值 → 违反 NOT NULL 约束 → 落库失败 → 接口 500/S01999
  11. -- (MySQL 原文 Field 'rec_id' doesn't have a default value;rec_id 仅因列序最先报错,修复需 4 列一并放开)。
  12. -- 本脚本将这 4 个已确认孤立的 NOT NULL 列改为可空,使新增可正常落库。
  13. -- (与 1.0.174.sql 对 BarCodeNbr 的同类修复同范式。)
  14. --
  15. -- 授权范围(用户拍板方案 A):
  16. -- - 仅将 rec_id、domain_code、nbr_type、is_active 改为 NULL。
  17. -- - 不删除任何列。
  18. -- - 不修改 PascalCase 真实业务列(RecID / Domain / NbrType / NbrClass / IsActive / CreateUser 等)。
  19. -- - 不修改 company_ref_id / factory_ref_id(NOT NULL 但实体已写入,不阻断 INSERT)。
  20. -- - 不更新任何业务数据。
  21. --
  22. -- 安全保证(阶段 0 实测 aidopdev 依据):
  23. -- - 4 列均不在任何索引/PK(PK=RecID,唯一键=IX_NbrTypeMaster(Domain,NbrClass,NbrType))。
  24. -- - 70 行该 4 列全为默认值(rec_id=0 / domain_code='' / nbr_type='' / is_active=0),零业务数据。
  25. -- - 全仓无任何代码引用这 4 个 snake 列;仅 1.0.176.sql 历史 UPDATE 过 company_ref_id/factory_ref_id(不涉本 4 列)。
  26. -- - 幂等:通过 information_schema.COLUMNS 前置判断「列存在且当前为 NOT NULL」才执行 ALTER,
  27. -- 再次执行(列已可空或列不存在)自动降级为 SELECT 1,0 变更。
  28. -- - 不 INSERT / UPDATE / DELETE / DROP / TRUNCATE 业务数据;不动其他表、其他列、索引、唯一约束。
  29. -- - 列类型与注释保持原样,仅放开 NULL 约束。
  30. --
  31. -- 回滚 SQL(仅在需要恢复 NOT NULL 时人工执行,不默认运行;
  32. -- 回滚前必须确认列内无 NULL 行,否则 ALTER 会失败):
  33. -- ALTER TABLE `NbrTypeMaster` MODIFY COLUMN `rec_id` bigint NOT NULL COMMENT '主键';
  34. -- ALTER TABLE `NbrTypeMaster` MODIFY COLUMN `domain_code` varchar(50) NOT NULL COMMENT '工厂域编码';
  35. -- ALTER TABLE `NbrTypeMaster` MODIFY COLUMN `nbr_type` varchar(100) NOT NULL COMMENT '单号类型编码';
  36. -- ALTER TABLE `NbrTypeMaster` MODIFY COLUMN `is_active` tinyint(1) NOT NULL COMMENT '是否启用';
  37. -- ============================================================
  38. -- ─── 1) 幂等放开 rec_id NOT NULL(仅当列存在且当前为 NOT NULL 时执行) ───
  39. SET @need_rec_id := (
  40. SELECT COUNT(*) FROM information_schema.COLUMNS
  41. WHERE TABLE_SCHEMA = DATABASE()
  42. AND TABLE_NAME = 'NbrTypeMaster'
  43. AND COLUMN_NAME = 'rec_id'
  44. AND IS_NULLABLE = 'NO'
  45. );
  46. SET @sql := IF(@need_rec_id = 1,
  47. 'ALTER TABLE `NbrTypeMaster` MODIFY COLUMN `rec_id` bigint NULL COMMENT ''主键''',
  48. 'SELECT 1');
  49. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  50. -- ─── 2) 幂等放开 domain_code NOT NULL(仅当列存在且当前为 NOT NULL 时执行) ───
  51. SET @need_domain_code := (
  52. SELECT COUNT(*) FROM information_schema.COLUMNS
  53. WHERE TABLE_SCHEMA = DATABASE()
  54. AND TABLE_NAME = 'NbrTypeMaster'
  55. AND COLUMN_NAME = 'domain_code'
  56. AND IS_NULLABLE = 'NO'
  57. );
  58. SET @sql := IF(@need_domain_code = 1,
  59. 'ALTER TABLE `NbrTypeMaster` MODIFY COLUMN `domain_code` varchar(50) NULL COMMENT ''工厂域编码''',
  60. 'SELECT 1');
  61. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  62. -- ─── 3) 幂等放开 nbr_type NOT NULL(仅当列存在且当前为 NOT NULL 时执行) ───
  63. SET @need_nbr_type := (
  64. SELECT COUNT(*) FROM information_schema.COLUMNS
  65. WHERE TABLE_SCHEMA = DATABASE()
  66. AND TABLE_NAME = 'NbrTypeMaster'
  67. AND COLUMN_NAME = 'nbr_type'
  68. AND IS_NULLABLE = 'NO'
  69. );
  70. SET @sql := IF(@need_nbr_type = 1,
  71. 'ALTER TABLE `NbrTypeMaster` MODIFY COLUMN `nbr_type` varchar(100) NULL COMMENT ''单号类型编码''',
  72. 'SELECT 1');
  73. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  74. -- ─── 4) 幂等放开 is_active NOT NULL(仅当列存在且当前为 NOT NULL 时执行) ───
  75. SET @need_is_active := (
  76. SELECT COUNT(*) FROM information_schema.COLUMNS
  77. WHERE TABLE_SCHEMA = DATABASE()
  78. AND TABLE_NAME = 'NbrTypeMaster'
  79. AND COLUMN_NAME = 'is_active'
  80. AND IS_NULLABLE = 'NO'
  81. );
  82. SET @sql := IF(@need_is_active = 1,
  83. 'ALTER TABLE `NbrTypeMaster` MODIFY COLUMN `is_active` tinyint(1) NULL COMMENT ''是否启用''',
  84. 'SELECT 1');
  85. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;