ver usuarios usuario recuperar postgres por datos crear contraseƱa consultas consola comandos cambiar postgresql metadata

recuperar - usuarios y roles en postgresql



Recuperando comentarios de una base de datos PostgreSQL (12)

Estoy ejecutando un proyecto en una base de datos de Postgres y necesito recuperar los comentarios en las columnas dentro del DB para usarlos como encabezados de tablas y cosas por el estilo. He visto que hay un par de funciones integradas ( pg_description y col_description ) pero no he podido encontrar ejemplos sobre cómo usarlas y jugar con ellas ha resultado bastante inútil.

Entonces, me preguntaba si alguien ha podido hacer esto antes y, de ser así, ¿cómo?


Genial, eso funciona para hacer aparecer un solo comentario, pero ¿hay alguna manera de mostrar todos los comentarios de todas las columnas sin múltiples declaraciones de selección o un ciclo?

¿Y cómo se lanza esto con una declaración?

Si quiere saber qué consultas ejecuta psql cuando hace / dt + o / d + clientes, simplemente lance con''E.

Gracias


Ok, entonces lo resolví en grado ...

seleccione col_description (identificación de la tabla, número de columna) ...

es decir: seleccione col_description (36698,2);

Eso funcionó, pero ¿hay una forma más fácil de hacer esto, tal vez traer todos los comentarios en todas las columnas y usar el nombre de la tabla en lugar del oid?


Esto funciona para mí usando la base de datos PostBooks 3.2.2:

select cols.column_name, (select pg_catalog.obj_description(oid) from pg_catalog.pg_class c where c.relname=cols.table_name) as table_comment ,(select pg_catalog.col_description(oid,cols.ordinal_position::int) from pg_catalog.pg_class c where c.relname=cols.table_name) as column_comment from information_schema.columns cols where cols.table_catalog=''postbooks'' and cols.table_name=''apapply''

Saludos, Sylnsr


Esta respuesta es un poco tarde, pero apareció en una búsqueda en Google que hice para investigar este problema. Solo necesitábamos descripciones de tabla, pero el método sería el mismo para las columnas. Las descripciones de las columnas están en la tabla pg_description también, referenciadas por objoid.

Añadir esta vista:

CREATE OR REPLACE VIEW our_tables AS SELECT c.oid, n.nspname AS schemaname, c.relname AS tablename, d.description, pg_get_userbyid(c.relowner) AS tableowner, t.spcname AS "tablespace", c.relhasindex AS hasindexes, c.relhasrules AS hasrules, c.reltriggers > 0 AS hastriggers FROM pg_class c LEFT JOIN pg_namespace n ON n.oid = c.relnamespace LEFT JOIN pg_tablespace t ON t.oid = c.reltablespace LEFT JOIN pg_description d ON c.oid = d.objoid WHERE c.relkind = ''r''::"char"; ALTER TABLE our_tables OWNER TO postgres; GRANT SELECT, UPDATE, INSERT, DELETE, REFERENCES, TRIGGER ON TABLE our_tables TO postgres; GRANT SELECT ON TABLE our_tables TO public;

Entonces corre:

SELECT tablename, description FROM our_tables WHERE schemaname = ''public''

La vista es una versión modificada de la vista pg_tables que se agrega en la columna de descripción. También podría pasear con la definición de la vista para convertirla en una sola consulta.


SELECT c.table_schema,c.table_name,c.column_name,pgd.description FROM pg_catalog.pg_statio_all_tables as st inner join pg_catalog.pg_description pgd on (pgd.objoid=st.relid) inner join information_schema.columns c on (pgd.objsubid=c.ordinal_position and c.table_schema=st.schemaname and c.table_name=st.relname);


Todo funciona por oid,

mat=> SELECT c.oid FROM pg_catalog.pg_class c WHERE c.relname = ''customers''; oid ------- 23208 (1 row)

Ahora, tengo el OID para esa tabla, entonces puedo preguntar:

mat=> select pg_catalog.obj_description(23208); obj_description ------------------- Customers (1 row)

Entonces, puedo pedir la descripción de la cuarta columna:

mat=> select pg_catalog.col_description(23208,4); col_description ----------------------------------------- Customer codes, CHS, FACTPOST, POWER... (1 row)

Si quiere saber qué consultas ejecuta psql cuando hace /dt+ o /d+ customers , simplemente ejecútelo con -E .


Solo para estar aquí si alguien lo necesita.

Aquí hay muchas respuestas, pero ninguna fue tan simple como me gustaría que fuera. Entonces, en base a las respuestas anteriores y al postgres actual 9.4, he creado esta consulta:

SELECT obj_description(format(''%s.%s'',isc.table_schema,isc.table_name)::regclass::oid, ''pg_class'') as table_description, pg_catalog.col_description(format(''%s.%s'',isc.table_schema,isc.table_name)::regclass::oid,isc.ordinal_position) as column_description FROM information_schema.columns isc

Obtiene las descripciones de tabla y columna, sin combinaciones confusas y concatenaciones de cadenas feas.


Acabo de encontrar esto aquí. Le proporcionará todo tipo de metadatos en una tabla específica (tipo, valor predeterminado, indicador nulo, longitud, comentario, nombre de clave externa, nombre de clave principal). Parece que funciona bien.

SELECT pg_tables.tablename, pg_attribute.attname AS field, format_type(pg_attribute.atttypid, NULL) AS "type", pg_attribute.atttypmod AS len, (SELECT col_description(pg_attribute.attrelid, pg_attribute.attnum)) AS comment, CASE pg_attribute.attnotnull WHEN false THEN 1 ELSE 0 END AS "notnull", pg_constraint.conname AS "key", pc2.conname AS ckey, (SELECT pg_attrdef.adsrc FROM pg_attrdef WHERE pg_attrdef.adrelid = pg_class.oid AND pg_attrdef.adnum = pg_attribute.attnum) AS def FROM pg_tables, pg_class JOIN pg_attribute ON pg_class.oid = pg_attribute.attrelid AND pg_attribute.attnum > 0 LEFT JOIN pg_constraint ON pg_constraint.contype = ''p''::"char" AND pg_constraint.conrelid = pg_class.oid AND (pg_attribute.attnum = ANY (pg_constraint.conkey)) LEFT JOIN pg_constraint AS pc2 ON pc2.contype = ''f''::"char" AND pc2.conrelid = pg_class.oid AND (pg_attribute.attnum = ANY (pc2.conkey)) WHERE pg_class.relname = pg_tables.tablename -- AND pg_tables.tableowner = "current_user"() AND pg_attribute.atttypid <> 0::oid AND tablename=''your_table'' ORDER BY field ASC

Fuente: http://golden13.blogspot.de/2012/08/how-to-get-some-information-about_7.html


Hice una pregunta similar sobre los comentarios de Postgresql el mes pasado. Si profundizas en eso, encontrarás algún código de Perl en mi blog que automatiza el proceso de extracción de un comentario.

Para extraer los nombres de las columnas de una tabla, puede usar algo como lo siguiente:

select a.attname as "colname" ,a.attrelid as "tableoid" ,a.attnum as "columnoid" from pg_catalog.pg_attribute a inner join pg_catalog.pg_class c on a.attrelid = c.oid where c.relname = ''mytable'' -- better to use a placeholder and a.attnum > 0 and a.attisdropped is false and pg_catalog.pg_table_is_visible(c.oid) order by a.attnum

A continuación, puede usar el tableoide, una tupla columnoide para extraer el comentario de cada columna (vea mi pregunta).


Mejora para las sugerencias @Nick y @mat: uso
SELECT obj_description(''schemaName.tableName''::regclass, ''pg_class''); cuando tienes el nombre de la cadena (no oid).

Para evitar recordar el parámetro ''pg_class'', y para evitar concatenaciones desagradables en las llamadas a funciones, como (tname||''.''||schema)::regclass , una sobrecarga útil para obj_description :

CREATE FUNCTION obj_description( p_rname text, p_schema text DEFAULT NULL, p_catalname text DEFAULT ''pg_class'' ) RETURNS text AS $f$ SELECT obj_description((CASE WHEN strpos($1, ''.'')>0 OR $2 IS NULL OR $2='''' THEN $1 ELSE $2||''.''||$1 END)::regclass, $3); $f$ LANGUAGE SQL IMMUTABLE; -- USAGE: obj_description(''mytable'') -- SELECT obj_description(''s.t''); -- PS: obj_description(''s.t'', ''otherschema'') is a syntax error, -- but not generates exception: returns the same as (''s.t'')

Ahora es fácil de usar, porque el nombre de la tabla (parámetro rname ) es varchar y se puede expresar con un campo separado para el nombre del esquema , como en las tablas principales y las consultas.

Consulte también " Obtención de la lista de comentarios de tabla en PostgreSQL " o la nueva Guía de pg9.3


Tenga cuidado con los esquemas, este código los considera:

SELECT cols.column_name, ( SELECT pg_catalog.col_description(c.oid, cols.ordinal_position::int) FROM pg_catalog.pg_class c WHERE c.oid = (SELECT (''"'' || cols.table_name || ''"'')::regclass::oid) AND c.relname = cols.table_name ) AS column_comment FROM information_schema.columns cols WHERE cols.table_catalog = ''your_database'' AND cols.table_name = ''your_table'' AND cols.table_schema = ''your_schema'';

Referencias


Accedí a los comentarios de la tabla como este:

select c.relname table_name, pg_catalog.obj_description(c.oid) as comment from pg_catalog.pg_class c where c.relname = ''table_name'';

y la columna comenta así:

SELECT c.column_name, pgd.description FROM pg_catalog.pg_statio_all_tables as st inner join pg_catalog.pg_description pgd on (pgd.objoid=st.relid) inner join information_schema.columns c on (pgd.objsubid=c.ordinal_position and c.table_schema=st.schemaname and c.table_name=st.relname and c.table_name = ''table_name'' and c.table_schema = ''public'');