Definir o comentário de uma coluna para o de outro coluna no PostgreSQL

votos
6

Suponha que eu criar uma tabela no PostgreSQL com um comentário sobre uma coluna:

create table t1 (
   c1 varchar(10)
);
comment on column t1.c1 is 'foo';

Algum tempo depois, eu decidir adicionar outra coluna:

alter table t1 add column c2 varchar(20);

Eu quero olhar para cima o comentário conteúdo da primeira coluna, e se associar com a nova coluna:

select comment_text from (what?) where table_name = 't1' and column_name = 'c1'

A (o quê?) Vai ser uma tabela do sistema, mas depois de ter olhou em volta, pgAdmin e pesquisar na web eu não aprendi o seu nome.

Idealmente, eu gostaria de ser capaz de:

comment on column t1.c1 is (select ...);

mas eu tenho um sentimento que é esticar as coisas um pouco longe. Obrigado por todas as idéias.

Update: com base nas sugestões que recebi aqui, acabei escrevendo um programa para automatizar a tarefa de transferência de comentários, como parte de um processo maior de mudar o tipo de dados de uma coluna PostgreSQL. Você pode ler sobre isso no meu blog .

Publicado 07/11/2008 em 16:29
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

Você pode recuperar comentários sobre colunas usando o col_description função do sistema (table_oid, column_number). Veja esta página para mais detalhes.

Respondeu 07/11/2008 em 16:55
fonte usuário

votos
5

A próxima coisa a saber é como obter o OID da tabela. Eu acho que a utilização deste como parte de comentário sobre não vai funcionar, como você suspeita.

    postgres = # criar comtest1 mesa (int id, val varchar);
    CRIAR A TABELA
    postgres = # inserção em valores comtest1 (1, 'a');
    INSERÇÃO IGNORO 0 1
    postgres = # seleccionar tableoid distinta da comtest1;
     tableoid
    ----------
        32792
    (Uma linha)

    postgres = # comentário sobre comtest1.id coluna é 'Identificador Number One';
    COMENTE
    postgres = # select col_description (32792,1);
        col_description
    -----------------------
     Identificador Number One
    (Uma linha)

De qualquer forma, eu chicoteado até uma função plpgsql rápido para copiar observações de um par de tabela / coluna para outra. Você tem que createlang plpgsql no banco de dados e usá-lo como este:

    Copie o comentário na primeira coluna da comtest1 tabela para o id 
    coluna da tabela comtest2. Sim, deve ser melhorado, mas
    o que resta como o trabalho para o leitor.

    postgres = # select copy_comment ( 'comtest1', 1, 'comtest2', 'id');
     copy_comment
    --------------
                1
    (Uma linha)
CREATE OR REPLACE FUNCTION copy_comment(varchar,int,varchar,varchar) RETURNS int AS $PROC$
DECLARE
        src_tbl ALIAS FOR $1;
        src_col ALIAS FOR $2;
        dst_tbl ALIAS FOR $3;
        dst_col ALIAS FOR $4;
        row RECORD;
        oid INT;
        comment VARCHAR;
BEGIN
        FOR row IN EXECUTE 'SELECT DISTINCT tableoid FROM ' || quote_ident(src_tbl) LOOP
                oid := row.tableoid;
        END LOOP;

        FOR row IN EXECUTE 'SELECT col_description(' || quote_literal(oid) || ',' || quote_literal(src_col) || ')' LOOP
                comment := row.col_description;
        END LOOP;

        EXECUTE 'COMMENT ON COLUMN ' || quote_ident(dst_tbl) || '.' || quote_ident(dst_col) || ' IS ' || quote_literal(comment);

        RETURN 1;
END;
$PROC$ LANGUAGE plpgsql;
Respondeu 07/11/2008 em 17:00
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more