2008-11-07 5 views
6

nehme ich auf einer Säule eine Tabelle in Postgresql mit einem Kommentar zu erstellen:den Kommentar einer Spalte zu der anderen Spalte in Postgresql Einstellung

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' 

die (was?) wird eine Systemtabelle sein, aber nachdem ich mich in pgAdmin umgesehen und im Internet gesucht habe, habe ich seinen Namen nicht erfahren.

Im Idealfall würde Ich mag in der Lage sein:

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

aber ich habe das Gefühl, dass ein Ding etwas weit Strecke ist. Danke für jede Idee.

Update: auf der Grundlage der Vorschläge, die ich hier erhalten habe, schrieb ich ein Programm zum Automatisieren der Aufgabe der Übertragung von Kommentaren als Teil eines größeren Prozesses der Änderung des Datentyps einer Postgresql-Spalte. Sie können darüber lesen on my blog.

Antwort

5

Die nächste Sache zu wissen ist, wie man die Tabelle oid erhält. Ich denke, dass dies als Teil des Kommentars nicht funktionieren wird, 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 verwenden Sie es wie folgt aus:

 
    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; 
+1

Leider, "Kommentar zu Spalte t1.c2 ist (select col_description ((verschiedene tableoid aus t1 auswählen), 1))" Syntaxfehler bei oder nahe "(" und das ist bei der ersten offenen Paren. Also nicht. – dland

1

Mit der Systemfunktion col_description (table_oid, column_number) können Sie Kommentare zu Spalten abrufen. Weitere Informationen finden Sie unter this page.

+1

ich nicht über Funktionen dachte, und fügt hinzu, dass ein Begrüßungs Dereferenzierungsebene aus den zugrundeliegenden Tabellen. Vielen Dank. – dland