61 lines
1.8 KiB
PL/PgSQL
61 lines
1.8 KiB
PL/PgSQL
BEGIN;
|
|
|
|
LOCK TABLE tb_agent_wallet IN ACCESS EXCLUSIVE MODE;
|
|
|
|
-- 出现信用配置、负余额或信用占用后,旧逻辑已无法安全解释资金事实,禁止回滚。
|
|
DO $$
|
|
DECLARE
|
|
unsafe_count bigint;
|
|
BEGIN
|
|
SELECT COUNT(*)
|
|
INTO unsafe_count
|
|
FROM tb_agent_wallet
|
|
WHERE credit_enabled
|
|
OR credit_limit <> 0
|
|
OR balance < 0
|
|
OR frozen_balance > balance;
|
|
|
|
IF unsafe_count > 0 THEN
|
|
RAISE EXCEPTION '已有 % 个钱包产生信用配置或旧逻辑无法解释的资金事实,禁止回滚信用字段,请清偿后再评估', unsafe_count;
|
|
END IF;
|
|
END
|
|
$$;
|
|
|
|
DROP INDEX IF EXISTS idx_agent_wallet_main_credit_enabled;
|
|
|
|
ALTER TABLE tb_agent_wallet
|
|
DROP CONSTRAINT IF EXISTS chk_agent_wallet_credit_config,
|
|
DROP CONSTRAINT IF EXISTS chk_agent_wallet_credit_scope,
|
|
DROP CONSTRAINT IF EXISTS chk_agent_wallet_frozen_nonnegative,
|
|
DROP CONSTRAINT IF EXISTS chk_agent_wallet_arithmetic_range,
|
|
DROP CONSTRAINT IF EXISTS chk_agent_wallet_available_balance,
|
|
DROP CONSTRAINT IF EXISTS chk_agent_wallet_version_nonnegative,
|
|
DROP COLUMN IF EXISTS credit_enabled,
|
|
DROP COLUMN IF EXISTS credit_limit;
|
|
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM pg_constraint
|
|
WHERE conrelid = 'tb_agent_wallet'::regclass
|
|
AND conname = 'chk_agent_wallet_balance'
|
|
) THEN
|
|
ALTER TABLE tb_agent_wallet
|
|
ADD CONSTRAINT chk_agent_wallet_balance CHECK (balance >= 0);
|
|
END IF;
|
|
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM pg_constraint
|
|
WHERE conrelid = 'tb_agent_wallet'::regclass
|
|
AND conname = 'chk_agent_wallet_frozen_balance'
|
|
) THEN
|
|
ALTER TABLE tb_agent_wallet
|
|
ADD CONSTRAINT chk_agent_wallet_frozen_balance CHECK (
|
|
frozen_balance >= 0 AND frozen_balance <= balance
|
|
);
|
|
END IF;
|
|
END
|
|
$$;
|
|
|
|
COMMIT;
|