fix(release): enforce AIHR tenant collation contract

This commit is contained in:
2026-07-15 13:33:56 +08:00
parent bd19cdd255
commit ab406e616a
19 changed files with 243 additions and 67 deletions
+38 -1
View File
@@ -11,6 +11,17 @@ MYSQL_CONTAINER="wygj-mysql"
DB="wygj_aihr_schema_test_$$"
LEGACY_DB="wygj_aihr_candidate_legacy_test_$$"
tenant_contract_violations="$({
find "$ROOT_DIR/backend/script/sql" -maxdepth 2 -type f -name 'aihr_*_mysql8.sql' -print0 \
| xargs -0 rg -n '^[[:space:]]*`?tenant_id`?[[:space:]]+varchar\(20\)' \
| grep -v 'COLLATE utf8mb4_general_ci'
} || true)"
if [[ -n "$tenant_contract_violations" ]]; then
echo "FAIL: AIHR tenant_id DDL must use the framework utf8mb4_general_ci contract:" >&2
printf '%s\n' "$tenant_contract_violations" >&2
exit 1
fi
while IFS= read -r migration; do
migration_name="$(basename "$migration")"
grep -Fq "backend/script/sql/update/$migration_name" "$ROOT_DIR/docs/BRD_PRODUCTION_MIGRATION_RUNBOOK.md" || {
@@ -185,4 +196,30 @@ test "$candidate_interview_tables" = 'aihr_candidate_employee_link,aihr_candidat
candidate_interview_columns="$(mysql "$LEGACY_DB" -N -B -e "SELECT COUNT(*) FROM information_schema.columns WHERE table_schema='$LEGACY_DB' AND ((table_name = 'aihr_candidate_material' AND column_name IN ('reviewer','reviewed_time')) OR (table_name = 'aihr_interview_result' AND column_name IN ('questions_json','reviewed_score','review_status','reviewer','review_note','reviewed_time')));")"
test "$candidate_interview_columns" = '8'
echo "PASS: AIHR legacy schema migrations are idempotent, including practice evidence, knowledge feedback, candidate interview review, and position/SOP qualification contracts"
mysql "$LEGACY_DB" <<'SQL'
CREATE TABLE sys_oss (
oss_id bigint NOT NULL,
tenant_id varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '000000',
PRIMARY KEY (oss_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE aihr_collation_probe (
id bigint NOT NULL,
oss_id bigint NOT NULL,
tenant_id varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '000000',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
INSERT INTO sys_oss (oss_id, tenant_id) VALUES (1, '000000');
INSERT INTO aihr_collation_probe (id, oss_id, tenant_id) VALUES (1, 1, '000000');
SQL
if mysql "$LEGACY_DB" -N -B -e "SELECT COUNT(*) FROM aihr_collation_probe a JOIN sys_oss o ON o.oss_id=a.oss_id AND o.tenant_id=a.tenant_id;" >/dev/null 2>&1; then
echo "FAIL: mixed-collation tenant join unexpectedly succeeded before migration" >&2
exit 1
fi
mysql "$LEGACY_DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260715_tenant_collation_mysql8.sql"
mysql "$LEGACY_DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260715_tenant_collation_mysql8.sql"
mismatched_tenant_columns="$(mysql "$LEGACY_DB" -N -B -e "SELECT COUNT(*) FROM information_schema.columns WHERE table_schema='$LEGACY_DB' AND table_name LIKE 'aihr\\_%' AND column_name='tenant_id' AND collation_name <> 'utf8mb4_general_ci';")"
test "$mismatched_tenant_columns" = '0'
collation_join_count="$(mysql "$LEGACY_DB" -N -B -e "SELECT COUNT(*) FROM aihr_collation_probe a JOIN sys_oss o ON o.oss_id=a.oss_id AND o.tenant_id=a.tenant_id;")"
test "$collation_join_count" = '1'
echo "PASS: AIHR legacy schema migrations are idempotent, including tenant collation compatibility"