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

Responder a