Files
App-Estoque-LiberiKids/scripts/adaptar_tabela_configuracoes.sql
2025-11-29 21:31:52 -03:00

117 lines
3.7 KiB
SQL

-- Adaptar a estrutura da tabela configuracoes existente
-- 1. Ver estrutura atual
SELECT column_name, data_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'configuracoes'
ORDER BY ordinal_position;
-- 2. Se a coluna é 'chave' e não 'tipo', vamos renomear
DO $$
BEGIN
-- Verificar se existe a coluna 'chave'
IF EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'configuracoes'
AND column_name = 'chave'
) AND NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'configuracoes'
AND column_name = 'tipo'
) THEN
-- Renomear 'chave' para 'tipo'
ALTER TABLE public.configuracoes RENAME COLUMN chave TO tipo;
RAISE NOTICE 'Coluna renomeada de chave para tipo';
END IF;
-- Garantir que a coluna tipo existe
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'configuracoes'
AND column_name = 'tipo'
) THEN
ALTER TABLE public.configuracoes ADD COLUMN tipo character varying NOT NULL DEFAULT '';
RAISE NOTICE 'Coluna tipo adicionada';
END IF;
-- Garantir que a coluna valor existe e é jsonb
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'configuracoes'
AND column_name = 'valor'
) THEN
ALTER TABLE public.configuracoes ADD COLUMN valor jsonb;
RAISE NOTICE 'Coluna valor adicionada';
END IF;
-- Se existe coluna 'valor_str' ou 'valor_string', migrar para 'valor' jsonb
IF EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'configuracoes'
AND column_name IN ('valor_str', 'valor_string')
) THEN
-- Tentar converter os dados
UPDATE public.configuracoes
SET valor = COALESCE(valor_str::jsonb, valor_string::jsonb)
WHERE valor IS NULL;
RAISE NOTICE 'Dados migrados para coluna valor';
END IF;
END $$;
-- 3. Remover constraint NOT NULL da coluna chave se ainda existir
DO $$
BEGIN
IF EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'configuracoes'
AND column_name = 'chave'
AND is_nullable = 'NO'
) THEN
ALTER TABLE public.configuracoes ALTER COLUMN chave DROP NOT NULL;
RAISE NOTICE 'Constraint NOT NULL removida da coluna chave';
END IF;
END $$;
-- 4. Adicionar constraint UNIQUE na coluna tipo
DO $$
BEGIN
-- Primeiro remover duplicados
DELETE FROM public.configuracoes
WHERE id IN (
SELECT id
FROM (
SELECT id, tipo,
ROW_NUMBER() OVER (PARTITION BY tipo ORDER BY updated_at DESC NULLS LAST, created_at DESC) as rn
FROM public.configuracoes
) t
WHERE rn > 1
);
-- Adicionar constraint
IF NOT EXISTS (
SELECT 1 FROM pg_constraint
WHERE conname = 'configuracoes_tipo_key'
AND conrelid = 'public.configuracoes'::regclass
) THEN
ALTER TABLE public.configuracoes ADD CONSTRAINT configuracoes_tipo_key UNIQUE (tipo);
RAISE NOTICE 'Constraint UNIQUE adicionada em tipo';
END IF;
END $$;
-- 5. Verificar resultado final
SELECT column_name, data_type, is_nullable
FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'configuracoes'
ORDER BY ordinal_position;
-- 6. Mostrar dados
SELECT * FROM public.configuracoes ORDER BY tipo;