235_account_proxy_mode_check.sql 1.2 KB

123456789101112131415161718192021222324252627282930313233
  1. -- 235_account_proxy_mode_check.sql
  2. -- proxy_mode 白名单:只允许缺失或 'random'。先归一化历史脏数据,再加约束。
  3. -- 1. 删除非法值(非字符串,或 trim/lower 后不是 random 的)。
  4. UPDATE accounts
  5. SET extra = COALESCE(extra, '{}'::jsonb) - 'proxy_mode'
  6. WHERE extra IS NOT NULL
  7. AND (extra ? 'proxy_mode')
  8. AND NOT (
  9. jsonb_typeof(extra->'proxy_mode') = 'string'
  10. AND lower(btrim(extra->>'proxy_mode')) = 'random'
  11. );
  12. -- 2. 归一化大小写/空白(如 ' Random ' -> 'random')。
  13. UPDATE accounts
  14. SET extra = jsonb_set(COALESCE(extra, '{}'::jsonb), '{proxy_mode}', '"random"'::jsonb, false)
  15. WHERE extra IS NOT NULL
  16. AND (extra ? 'proxy_mode')
  17. AND extra->>'proxy_mode' <> 'random';
  18. -- 幂等加约束(与 154_account_spark_shadow.sql 同一写法)。
  19. DO $$ BEGIN
  20. IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'chk_accounts_extra_proxy_mode') THEN
  21. ALTER TABLE accounts ADD CONSTRAINT chk_accounts_extra_proxy_mode
  22. CHECK (
  23. extra IS NULL
  24. OR NOT (extra ? 'proxy_mode')
  25. OR lower(btrim(extra->>'proxy_mode')) = 'random'
  26. ) NOT VALID;
  27. END IF;
  28. END $$;
  29. ALTER TABLE accounts VALIDATE CONSTRAINT chk_accounts_extra_proxy_mode;