Pessoal boa tarde,
Estou com o seguinte problema; Fui solicitado a inserir uma nova coluna em
todas as
tabelas de um determinado banco de dados. A minha ideia inicial foi de criar
uma função para
realizar tal tarefa, segue a função:
CREATE OR REPLACE FUNCTION f_addcolumn()
RETURNS integer AS
$BODY$
DECLARE
v_count INTEGER := 0;
v_cursor RECORD;
BEGIN
FOR v_cursor IN
SELECT tablename
FROM pg_tables t
WHERE t.schemaname = 'public'
ORDER BY t.tablename
--------------
LOOP
EXECUTE 'ALTER TABLE ' || v_cursor.tablename || ' ADD COLUMN
<nova_coluna> character(1) DEFAULT ''0'';';
--RAISE NOTICE 'ALTER TABLE % ADD COLUMN isaftermarket character(1)
DEFAULT ''0'';', v_cursor.tablename;
v_count := v_count + 1;
END LOOP;
--RAISE NOTICE 'Numero de tabelas alteradas: %', v_count;
RETURN v_count;
END;
$BODY$
LANGUAGE 'plpgsql';
Até ai tudo bem. O problema é que a base de dados em questão possui mais de
80000 tabelas. A função retorna
o erro:
PL/pgSQL function "f_addcolumn_isaftermarket" line 20 at EXECUTE statement
ERROR: out of shared memory
HINT: You might need to increase max_locks_per_transaction.
Uma solução paliativa que encontrei foi disparar um RAISE NOTICE jogar em um
arquivo, fazer as alterações necessárias
e executar como um script pelo psql. Acredito que aumentar o número de
max_locks_per_transaction não é a solução e muito menos ainda essa que eu
adotei. Gostaria de saber se existe uma forma mais "elegante" de executar
essa tarefa?
[]'s
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral