Files
KCGL/db_migrations/phase10_purchase_supplier_link_text.sql
yueli ccdd6e7306 fix(purchase): 商家地址链接放宽为 text,修超长链接保存失败
现象
----
采购管理新建采购申请时粘贴电商商品链接报错。实测该链接 **516 字符**,而
purchase_request.supplier_link 是 varchar(500) —— 超出 16 个字符,
PostgreSQL 直接拒绝(value too long for type character varying(500))。

★ 为什么用 text 而不是把 500 调大
  电商外链(淘宝/1688)普遍带很长的跟踪参数,长度没有稳定上界:本例已 516,
  再叠加一轮营销参数就可能破千。任何有限的 varchar(N) 都只是把报错往后推,
  而且**截断是静默的** —— 用户只会觉得「链接打不开」。
  同 material_base.purchase_link 的处理(那边一开始就用 text)。

附带确认(全部扫描,无需改动)
  从数据库层面扫了所有「有长度上限、且列名像 link/url/photo/image/
  signature/path」的列:
    · purchase_request.supplier_link(500)  ← 本次唯一真正有问题的
    · sys_menu.path(200)、sys_warehouse_location.full_path(500)  内部生成数据
    · stock_adjustment.linked_sku(100)/linked_outbound_no(50)     SKU 与单号
  用户粘贴外链的列仅此一处。

迁移用 DO 块先判断当前类型,可重复执行;含核对段与回滚段。
验证:把那条 516 字符的真实链接写入再读回,长度一致、内容未截断。
2026-09-18 09:34:44 +08:00

69 lines
3.1 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- =============================================================================
-- 采购申请「商家地址链接」放宽为 text
--
-- 现象
-- 新建采购申请时粘贴电商商品链接报错。实测该链接 **516 字符**,而
-- purchase_request.supplier_link 是 varchar(500) —— 超出 16 个字符,
-- PostgreSQL 直接拒绝value too long for type character varying(500))。
--
-- 为什么用 text 而不是把 500 调大
-- 电商外链(淘宝/1688 等)普遍带很长的跟踪参数,长度没有稳定上界:
-- 本例已 516再叠加一轮营销参数就可能破千。任何有限的 varchar(N) 都只是
-- 把报错往后推,而且**截断是静默的** —— 用户只会觉得「链接打不开」。
-- 同 material_base.purchase_link 的处理(那边一开始就用 text
--
-- 附带确认(无需改动)
-- 全库扫描 varchar 且列名像 link/url/photo/image/signature/path 的列,仅本列
-- 是用户粘贴的外链sys_menu.path(200)、sys_warehouse_location.full_path(500)
-- 是内部生成数据stock_adjustment.linked_*(50/100) 是 SKU 与单号,均不受影响。
--
-- 幂等ALTER TYPE 对已是 text 的列会报错,故用 DO 块先判断当前类型。
-- 不含 psql 元命令DataGrip 可直接执行。
-- =============================================================================
BEGIN;
DO $$
BEGIN
IF EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name = 'purchase_request'
AND column_name = 'supplier_link'
AND data_type = 'character varying'
) THEN
-- 加长类型不会丢数据varchar → text 是放宽,不是转换)
ALTER TABLE purchase_request
ALTER COLUMN supplier_link TYPE text;
END IF;
END $$;
COMMENT ON COLUMN purchase_request.supplier_link IS
'商家地址链接。text 无长度上限 —— 电商外链常带很长的跟踪参数varchar(N) 会把「链接太长」变成静默失败';
COMMIT;
-- =============================================================================
-- 执行后核对
-- =============================================================================
SELECT '=== 1) 列类型应为 textcharacter_maximum_length 为空)===' AS "核对项";
SELECT column_name, data_type, character_maximum_length AS
FROM information_schema.columns
WHERE table_name = 'purchase_request' AND column_name = 'supplier_link';
SELECT '=== 2) 现有数据长度分布(确认无截断)===' AS "核对项";
SELECT count(*) AS ,
count(*) FILTER (WHERE supplier_link IS NOT NULL AND supplier_link <> '') AS ,
coalesce(max(length(supplier_link)), 0) AS
FROM purchase_request;
-- =============================================================================
-- 回滚段
-- 注意:回滚前必须先确认没有超过 500 字符的数据,否则会失败。
-- =============================================================================
-- BEGIN;
-- ALTER TABLE purchase_request
-- ALTER COLUMN supplier_link TYPE varchar(500);
-- COMMIT;