Mais de 15 anos de experiência em Big Data transformados em scripts, funções e procedimentos totalmente gratuitos para você evoluir como desenvolvedor.
Corrija automaticamente todas as sequências do seu banco de dados
-- ============================================
-- Função: atualizar_todas_sequencias()
-- Autor: GVSoft
-- Descrição: Ajusta todas as sequências do banco
-- Baseado no maior ID atual de cada tabela
-- ============================================
CREATE OR REPLACE FUNCTION atualizar_todas_sequencias()
RETURNS TABLE(
tabela_nome TEXT,
coluna_id TEXT,
sequencia_nome TEXT,
valor_atual BIGINT,
novo_valor BIGINT,
status TEXT
)
LANGUAGE plpgsql
AS $$
DECLARE
registro RECORD;
seq_val_atual BIGINT;
max_id BIGINT;
novo_valor_seq BIGINT;
BEGIN
RAISE NOTICE 'Iniciando atualização de sequências...';
FOR registro IN
SELECT
n.nspname AS esquema,
c.relname AS tabela,
a.attname AS coluna,
pg_get_serial_sequence(c.relname, a.attname) AS seq_nome_completo
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
JOIN pg_attribute a ON a.attrelid = c.oid
JOIN pg_depend d ON d.refobjid = c.oid AND d.refobjsubid = a.attnum
WHERE
c.relkind IN ('r', 'p')
AND n.nspname NOT IN ('pg_catalog', 'information_schema')
AND d.deptype = 'a'
AND pg_get_serial_sequence(c.relname, a.attname) IS NOT NULL
LOOP
BEGIN
-- CORREÇÃO: Usar diretamente o nome completo da sequência sem %I.%I
EXECUTE format('SELECT last_value FROM %s',
registro.seq_nome_completo) INTO seq_val_atual;
EXECUTE format('SELECT COALESCE(MAX(%I), 0) FROM %I.%I',
registro.coluna, registro.esquema, registro.tabela) INTO max_id;
novo_valor_seq := CASE WHEN max_id = 0 THEN 1 ELSE max_id + 1 END;
IF seq_val_atual IS NULL OR seq_val_atual < novo_valor_seq THEN
EXECUTE format('SELECT setval(%L, %s, false)',
registro.seq_nome_completo, novo_valor_seq);
status := 'ATUALIZADO';
novo_valor := novo_valor_seq;
ELSE
status := 'OK';
novo_valor := seq_val_atual;
END IF;
tabela_nome := format('%I.%I', registro.esquema, registro.tabela);
coluna_id := registro.coluna;
sequencia_nome := registro.seq_nome_completo;
valor_atual := seq_val_atual;
RETURN NEXT;
EXCEPTION WHEN OTHERS THEN
status := format('ERRO: %s', SQLERRM);
RETURN NEXT;
END;
END LOOP;
END;
$$;
-- COMO USAR:
-- SELECT * FROM atualizar_todas_sequencias();
Funções, procedures, triggers e otimizações para alto desempenho
42 snippetsStored procedures, índices e consultas otimizadas
28 snippetsETL, data processing, automação e scripts para Big Data
35 snippetsAPIs, utilitários e ferramentas para front/back-end
23 snippetsSpark, Hadoop, otimizações e boas práticas
15 snippetsDockerfiles, docker-compose e ambientes de dev
12 snippets