diff --git a/deploy/sql/头程数据库统一增量-MySQL8.sql b/deploy/sql/头程数据库统一增量-MySQL8.sql index 6f92303cc..a29e85c56 100644 --- a/deploy/sql/头程数据库统一增量-MySQL8.sql +++ b/deploy/sql/头程数据库统一增量-MySQL8.sql @@ -10428,6 +10428,26 @@ CREATE TABLE IF NOT EXISTS fl_carrier_schedule_query_operation ( CONSTRAINT chk_carrier_schedule_operation_status CHECK (status IN ('PROCESSING','SUCCESS')) ) ENGINE=InnoDB COMMENT='船司查询写操作幂等与请求摘要'; +-- CREATE TABLE IF NOT EXISTS 不会更新已有表的 CHECK。历史开发库仍可能只允许 +-- CREATE/ATTEMPT/MANUAL_RESULT,必须在人工节点和自动节点写入前收敛为当前动作集。 +DROP PROCEDURE IF EXISTS migrate_carrier_schedule_history_action_check; +DELIMITER $$ +CREATE PROCEDURE migrate_carrier_schedule_history_action_check() +BEGIN + IF EXISTS (SELECT 1 FROM information_schema.table_constraints + WHERE constraint_schema=DATABASE() AND table_name='fl_carrier_schedule_query_history' + AND constraint_name='chk_carrier_schedule_history_action' AND constraint_type='CHECK') THEN + ALTER TABLE fl_carrier_schedule_query_history DROP CHECK chk_carrier_schedule_history_action; + END IF; + ALTER TABLE fl_carrier_schedule_query_history + ADD CONSTRAINT chk_carrier_schedule_history_action CHECK + (action IN ('CREATE','AUTO_CREATE','MANUAL_RESULT','MANUAL_NODE','NODE_OBSERVED', + 'EXCEPTION_OBSERVED','PROVIDER_QUERY','STOP')); +END$$ +DELIMITER ; +CALL migrate_carrier_schedule_history_action_check(); +DROP PROCEDURE IF EXISTS migrate_carrier_schedule_history_action_check; + DROP TRIGGER IF EXISTS trg_carrier_schedule_query_before_insert; DELIMITER $$ CREATE TRIGGER trg_carrier_schedule_query_before_insert BEFORE INSERT ON fl_carrier_schedule_query FOR EACH ROW diff --git a/firstleg/src/main/resources/db/phase3-carrier-schedule-query-schema.sql b/firstleg/src/main/resources/db/phase3-carrier-schedule-query-schema.sql index f5bf83b25..f37916125 100644 --- a/firstleg/src/main/resources/db/phase3-carrier-schedule-query-schema.sql +++ b/firstleg/src/main/resources/db/phase3-carrier-schedule-query-schema.sql @@ -181,6 +181,26 @@ CREATE TABLE IF NOT EXISTS fl_carrier_schedule_query_operation ( CONSTRAINT chk_carrier_schedule_operation_status CHECK (status IN ('PROCESSING','SUCCESS')) ) ENGINE=InnoDB COMMENT='船司查询写操作幂等与请求摘要'; +-- CREATE TABLE IF NOT EXISTS 不会更新已有表的 CHECK。历史开发库仍可能只允许 +-- CREATE/ATTEMPT/MANUAL_RESULT,必须在人工节点和自动节点写入前收敛为当前动作集。 +DROP PROCEDURE IF EXISTS migrate_carrier_schedule_history_action_check; +DELIMITER $$ +CREATE PROCEDURE migrate_carrier_schedule_history_action_check() +BEGIN + IF EXISTS (SELECT 1 FROM information_schema.table_constraints + WHERE constraint_schema=DATABASE() AND table_name='fl_carrier_schedule_query_history' + AND constraint_name='chk_carrier_schedule_history_action' AND constraint_type='CHECK') THEN + ALTER TABLE fl_carrier_schedule_query_history DROP CHECK chk_carrier_schedule_history_action; + END IF; + ALTER TABLE fl_carrier_schedule_query_history + ADD CONSTRAINT chk_carrier_schedule_history_action CHECK + (action IN ('CREATE','AUTO_CREATE','MANUAL_RESULT','MANUAL_NODE','NODE_OBSERVED', + 'EXCEPTION_OBSERVED','PROVIDER_QUERY','STOP')); +END$$ +DELIMITER ; +CALL migrate_carrier_schedule_history_action_check(); +DROP PROCEDURE IF EXISTS migrate_carrier_schedule_history_action_check; + DROP TRIGGER IF EXISTS trg_carrier_schedule_query_before_insert; DELIMITER $$ CREATE TRIGGER trg_carrier_schedule_query_before_insert BEFORE INSERT ON fl_carrier_schedule_query FOR EACH ROW diff --git a/firstleg/src/test/java/com/baiyue/firstleg/portschedule/repository/CarrierScheduleQuerySqlContractTest.java b/firstleg/src/test/java/com/baiyue/firstleg/portschedule/repository/CarrierScheduleQuerySqlContractTest.java index ba178fd07..b7e0d4d7e 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/portschedule/repository/CarrierScheduleQuerySqlContractTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/portschedule/repository/CarrierScheduleQuerySqlContractTest.java @@ -34,6 +34,10 @@ class CarrierScheduleQuerySqlContractTest { .contains("DISCHARGED_FROM_VESSEL") .contains("PICKED_UP','EMPTY_RETURNED") .contains("CUSTOMS_HOLD','TERMINAL_HOLD','DOCUMENT_HOLD','UNKNOWN_HOLD") + .contains("CREATE PROCEDURE migrate_carrier_schedule_history_action_check()") + .contains("DROP CHECK chk_carrier_schedule_history_action") + .contains("'MANUAL_NODE','NODE_OBSERVED'") + .contains("'EXCEPTION_OBSERVED','PROVIDER_QUERY','STOP'") .contains("provider_event_id") .contains("'PUBLIC_FORM','PUBLIC_WEB_PROXY','PUBLIC_HTML','HCAPTCHA','OFFICIAL_API'") .contains("lease_owner") @@ -86,6 +90,10 @@ class CarrierScheduleQuerySqlContractTest { .contains("SET @carrier_schedule_now = CONVERT_TZ(UTC_TIMESTAMP(3),'+00:00','+08:00')") .contains("SET @carrier_schedule_next = CASE") .contains("CREATE PROCEDURE ensure_carrier_schedule_retry_check()") + .contains("CREATE PROCEDURE migrate_carrier_schedule_history_action_check()") + .contains("DROP CHECK chk_carrier_schedule_history_action") + .contains("'MANUAL_NODE','NODE_OBSERVED'") + .contains("'EXCEPTION_OBSERVED','PROVIDER_QUERY','STOP'") .contains("ADD CONSTRAINT chk_carrier_schedule_query_attempt CHECK (attempt_count BETWEEN 0 AND 3)") .contains("统一迁移失败:船司查询固定槽位字段、索引或尝试次数约束不完整") .doesNotContain("DROP CHECK chk_carrier_schedule_query_attempt")