4.1 KiB
4.1 KiB
BD_Manual:tenant_id INTEGER → BIGINT 迁移
日期:2026-03-03 涉及库:
etl_feiqiu/test_etl_feiqiu、zqyy_app/test_zqyy_app迁移脚本:
db/etl_feiqiu/migrations/2026-03-03__alter_tenant_id_int_to_bigint.sqldb/zqyy_app/migrations/2026-03-03__alter_tenant_id_int_to_bigint.sql直接原因:飞球 tenant_id(如 2790683160709957)远超 int4 上限(2,147,483,647),导致写入溢出 Prompt 摘要:修复 tenant_id int4 溢出问题,迁移为 bigint
1. 变更说明
变更前
| 库 | Schema | 表 | 列 | 类型 |
|---|---|---|---|---|
| etl_feiqiu | dws | dws_assistant_order_contribution | tenant_id | INTEGER (int4) NOT NULL |
| zqyy_app | auth | site_code_mapping | tenant_id | INTEGER (int4) NULL |
变更后
| 库 | Schema | 表 | 列 | 类型 |
|---|---|---|---|---|
| etl_feiqiu | dws | dws_assistant_order_contribution | tenant_id | BIGINT (int8) NOT NULL |
| zqyy_app | auth | site_code_mapping | tenant_id | BIGINT (int8) NULL |
级联影响
| 对象 | 类型 | 处理方式 |
|---|---|---|
app.v_dws_assistant_order_contribution (ETL 库) |
RLS 视图 | DROP → ALTER → 重建(SELECT *) |
fdw_etl.v_dws_assistant_order_contribution (App 库) |
FDW 外部表 | DROP → IMPORT FOREIGN SCHEMA 重新导入 |
app.v_dws_assistant_order_contribution (App 库) |
RLS 视图 | 自动继承 FDW 外部表类型 |
2. 兼容性影响
| 组件 | 影响 | 说明 |
|---|---|---|
| ETL 任务 | 无影响 | assistant_order_contribution_task.py 从 DWD 层读取 tenant_id(已是 bigint),写入 DWS 现在类型匹配 |
| 后端 API | 无影响 | 通过 FDW 视图读取,类型自动跟随源表 |
| 小程序 | 无影响 | 不直接使用 tenant_id |
init_test_user.py |
已更新 | 移除 _safe_tenant_id() 中的 int4 范围检查降级逻辑 |
3. 回滚策略
ETL 库回滚
BEGIN;
DROP VIEW IF EXISTS app.v_dws_assistant_order_contribution CASCADE;
ALTER TABLE dws.dws_assistant_order_contribution ALTER COLUMN tenant_id TYPE integer;
CREATE OR REPLACE VIEW app.v_dws_assistant_order_contribution AS
SELECT * FROM dws.dws_assistant_order_contribution
WHERE site_id = current_setting('app.current_site_id')::bigint;
GRANT SELECT ON app.v_dws_assistant_order_contribution TO app_reader;
COMMIT;
App 库回滚
BEGIN;
ALTER TABLE auth.site_code_mapping ALTER COLUMN tenant_id TYPE integer;
COMMIT;
代码回滚
恢复 scripts/ops/init_test_user.py 中 _safe_tenant_id() 的 int4 范围检查逻辑。
4. 验证 SQL
ETL 库(test_etl_feiqiu)
-- 1. 确认 dws 表 tenant_id 类型
SELECT column_name, data_type, udt_name
FROM information_schema.columns
WHERE table_schema = 'dws'
AND table_name = 'dws_assistant_order_contribution'
AND column_name = 'tenant_id';
-- 预期:data_type = 'bigint', udt_name = 'int8'
-- 2. 确认 RLS 视图存在且类型正确
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_schema = 'app'
AND table_name = 'v_dws_assistant_order_contribution'
AND column_name = 'tenant_id';
-- 预期:data_type = 'bigint'
-- 3. 确认全库无残留 int4 tenant_id
SELECT table_schema, table_name
FROM information_schema.columns
WHERE column_name = 'tenant_id' AND udt_name = 'int4';
-- 预期:0 行
App 库(test_zqyy_app)
-- 1. 确认 auth 表 tenant_id 类型
SELECT column_name, data_type, udt_name
FROM information_schema.columns
WHERE table_schema = 'auth'
AND table_name = 'site_code_mapping'
AND column_name = 'tenant_id';
-- 预期:data_type = 'bigint', udt_name = 'int8'
-- 2. 确认 FDW 外部表类型正确
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_schema = 'fdw_etl'
AND table_name = 'v_dws_assistant_order_contribution'
AND column_name = 'tenant_id';
-- 预期:data_type = 'bigint'
-- 3. 确认全库无残留 int4 tenant_id
SELECT table_schema, table_name
FROM information_schema.columns
WHERE column_name = 'tenant_id' AND udt_name = 'int4';
-- 预期:0 行