2013/12/18 Eloi <[email protected]>

> Ola a toda a lista,
>
> Estou a tentar fazer funcionar a seguinte função para mover todas as
> tabelas de um esquema para outro.
> Não obtenho nenhum erro mas no entanto nada é movido.
> Peculiaridades: o nome do esquema de origem está em "PascalCase" e o de
> destino em minúsculas.
>
> Alguém me pode indicar o que estou a fazer mal?
>
> CREATE OR REPLACE FUNCTION sys_move_tables(sch_from text, sch_to text)
>   RETURNS text AS
> $BODY$
> DECLARE
>     row record;
> BEGIN
>     FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = sch_from
>     LOOP
>         EXECUTE 'ALTER TABLE ' || sch_from || '.' ||
> quote_ident(row.tablename) || ' SET SCHEMA ' || sch_to || ';';
>     END LOOP;
> RETURN 'Tables were moved';
> END;
> $BODY$
>   LANGUAGE plpgsql VOLATILE
>   COST 100;
>
> ALTER FUNCTION sys_move_tables(text, text) OWNER TO postgres;
>
> SELECT sys_move_tables('"OrigEm"', 'destino');
>
> Obrigado. Cumprimentos,
>

Simples. Sua função não executa nada por causa da seguinte consulta:

    SELECT tablename FROM pg_tables WHERE schemaname = sch_from;

Veja que você passou '"OrigEm"' para sch_from, logo essa consulta ficaria:

    SELECT tablename FROM pg_tables WHERE schemaname = '"OrigEm"';

Mas nas tabelas de catálogo, os nomes são armazenados diretamente, sem
aspas duplas, logo sua consulta não traz nenhum registros e o loop não é
executado.

A solução é não passar com aspas duplas na chamada da função e tratar
dentro da mesma:

    CREATE OR REPLACE FUNCTION sys_move_tables(sch_from text, sch_to text)
      RETURNS text AS
    $BODY$
    DECLARE
        row record;
    BEGIN
        FOR row IN SELECT tablename FROM pg_tables WHERE schemaname =
sch_from
        LOOP
            EXECUTE 'ALTER TABLE ' || quote_ident(sch_from) || '.' ||
    quote_ident(row.tablename) || ' SET SCHEMA ' || quote_ident(sch_to) ||
';';
        END LOOP;
    RETURN 'Tables were moved';
    END;
    $BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;

    SELECT sys_move_tables('OrigEm', 'destino');


Atenciosamente,
-- 
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a