SQL

PostgreSQL Schema Output

Obteniendo un listado de tablas, columnas y tipo de datos de un PostgreSQL

Hoy me encontraba trabajando para un proyecto propio, en el cual tengo que interactuar con un sistema legacy (+10 años) montado sobre un servidor de base de datos PostgreSQL.

Como se pueden imaginar, el esquema de la base de datos no es muy amigable, los nombres de las columnas poco descriptivos, y las foreing keys cuasi inexistentes.

Para sumarle complejidad el desarrollo lo estoy haciendo a distancia, por lo que la comunicación con el departamento de sistemas es escueta y por mail. Por lo que para simplificar la misma decidí hacer una especie de “diccionario de datos”, en el cual pienso documentar el esquema de la DB y el significado de cada tabla y campo.

Para hacer esto me topé con que en internet fue difícil encontrar un query SQL que me diera esta información, así que luego de una pequeña renegada pude solucionar, teniendo este SQL como output:

SELECT
	c.relname as "Table",
	a.attname as "Column",
	pg_catalog.format_type(a.atttypid, a.atttypmod) as "Datatype"
FROM
	pg_catalog.pg_attribute a
	INNER JOIN pg_catalog.pg_class c ON a.attrelid = c.oid
		LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE
	a.attnum > 0
	AND NOT a.attisdropped
	AND n.nspname = 'public'
ORDER BY
	c.relname ASC,
	a.attname ASC,
	pg_catalog.format_type(a.atttypid, a.atttypmod) ASC

Que nos dará como resultado algo como:

La consulta no esta optimizada, pero a mi me sirvió, quizás a alguno de ustedes le sirva como está o con algún que otro WHERE más.

Saludos,

Cambiar Itercalación (COLLATE) de tablas en masa

Luego de un día entero de renagar con un problema de collation, ocurrido por usar SQL Compare de RedGate encuentro como solucionar el problema que ocurre al tratar de comparar dos columnas con diferentes collations.

Insertar valores en una Identity PK

Ya que estamos con el tema de las identities PK, aprovecho para hacer este post de ayuda memoria.

Para insertar valores en columnas Identity hay que hacer:

SET IDENTITY_INSERT ON [myTable] ON

y luego de hacer los inserts correspondientes apagar esto con

SET IDENTITY_INSERT ON [myTable] OFF

And happy coding!

Saludos!