Frage

Angenommen, ich auf einer Säule eine Tabelle in Postgresql mit einem Kommentar erstellen:

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

Einige Zeit später, ich entscheide, eine weitere Spalte hinzuzufügen:

alter table t1 add column c2 varchar(20);

Ich möchte den Kommentar Inhalt der ersten Spalte sehen, und sich mit der neuen Spalte:

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

(was?) Wird eine Systemtabelle sein, aber nach dem in pgAdmin umsah zu haben und auf der Suche im Web ich seinen Namen nicht gelernt haben.

Im Idealfall würde Ich mag zu können:

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

, aber ich habe das Gefühl, dass die Dinge ein bisschen weit ist Stretching. Vielen Dank für alle Ideen.

Update: auf der Grundlage der Vorschläge, die ich hier empfangen, Wund ich ein Programm zu schreiben, um die Aufgabe zu übertragen Kommentare zu automatisieren, als Teil eines größeren Prozesses von den Datentyp einer Postgresql Spalte zu ändern. Sie können über diese auf meinem Blog .

War es hilfreich?

Lösung

Das nächste, was zu wissen, wie die Tabelle oid zu erhalten. Ich denke, dass über die Verwendung dieses als Teil des Kommentars wird nicht funktionieren, wie Sie vermuten.

    postgres=# create table comtest1 (id int, val varchar);
    CREATE TABLE
    postgres=# insert into comtest1 values (1,'a');
    INSERT 0 1
    postgres=# select distinct tableoid from comtest1;
     tableoid
    ----------
        32792
    (1 row)

    postgres=# comment on column comtest1.id is 'Identifier Number One';
    COMMENT
    postgres=# select col_description(32792,1);
        col_description
    -----------------------
     Identifier Number One
    (1 row)

Wie auch immer, peitschte ich eine schnelle plpgsql Funktion Kommentare aus einer Tabelle / Spaltenpaar auf ein anderes zu kopieren. Sie haben in der Datenbank create plpgsql und es wie folgt verwendet werden:

    Copy the comment on the first column of table comtest1 to the id 
    column of the table comtest2. Yes, it should be improved but 
    that's left as work for the reader.

    postgres=# select copy_comment('comtest1',1,'comtest2','id');
     copy_comment
    --------------
                1
    (1 row)
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;

Andere Tipps

Sie können Kommentare über Spalten abrufen, die Systemfunktion col_description mit (table_oid, Spaltennummer). Siehe dieser Seite weitere Details.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top