-- 软删除支持迁移
-- 大厂通用做法: deleted_at 为 NULL 表示未删除，通过部分唯一索引确保有效记录唯一

-- 1. 添加 deleted_at 字段
ALTER TABLE authorization_roles
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP;

-- 2. 将现有 REVOKED 状态的记录设置 deleted_at
UPDATE authorization_roles
SET deleted_at = revoked_at
WHERE status = 'REVOKED' AND deleted_at IS NULL;

-- 3. 删除原有的唯一约束或索引（如果存在）
-- 注意: Prisma 生成的可能是 CONSTRAINT 或 INDEX，需要两种都尝试删除
ALTER TABLE authorization_roles
DROP CONSTRAINT IF EXISTS authorization_roles_account_sequence_role_type_region_code_key;
DROP INDEX IF EXISTS authorization_roles_account_sequence_role_type_region_code_key;

-- 4. 创建部分唯一索引（只对未删除的记录生效）
-- 这是大厂的标准做法，支持软删除后重新创建相同记录
CREATE UNIQUE INDEX IF NOT EXISTS uk_authorization_active
ON authorization_roles (account_sequence, role_type, region_code)
WHERE deleted_at IS NULL;

-- 5. 创建 deleted_at 索引用于查询优化
CREATE INDEX IF NOT EXISTS idx_authorization_deleted_at
ON authorization_roles (deleted_at);
