Estou construindo um teste de integração em um aplicativo que provisiona um banco de dados para um usuário. O usuário criado para ele não é um superusuário, e não tem acesso ao schema_information.tables pois quando tento o seguinte script:
SELECT table_name
FROM information_schema.tables
WHERE table_schema='{schema}'
Recebo um retorno de 0, como deveria, pois esse usuário não tem permissão.
Estou tentando consultar o banco de dados para verificar as tabelas e as colunas criadas. Posso obter a lista de nomes de tabelas através do catálogo do sistema com o seguinte script:
SELECT tablename
FROM pg_catalog.pg_tables
WHERE schemaname = '{schema}'
E isso gera os nomes das tabelas do jeito que eu quero:
empresa, localização, pessoa, etc...
Não consigo encontrar o script com o catálogo do sistema para encontrar os nomes das colunas ( E como bônus, o tipo de dados ) de cada tabela. Até agora tentei o seguinte:
SELECT attname, format_type(atttypid, atttypmod) AS type
FROM pg_attribute
WHERE attrelid = 'business'
e aqui está o erro:
ERROR: invalid input syntax for type oid: "business"
LINE 1: ...od) AS type FROM pg_attribute WHERE attrelid = 'business'
^```
Também tentei:
SELECT
a.attname as "Column",
pg_catalog.format_type(a.atttypid, a.atttypmod) as "Datatype"
FROM
pg_catalog.pg_attribute a
WHERE
a.attnum > 0
AND NOT a.attisdropped
AND a.attrelid = (
SELECT c.oid
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname ~ '**Dont know what to put here, Schema? Database?**'
--AND pg_catalog.pg_table_is_visible(c.oid)
);
e isso retorna 0 com um esquema ou banco de dados. Não tenho certeza do que colocar lá para c.relname. Também estou vendo 0 com isso porque um usuário básico simplesmente não pode ver mais profundamente do que tabelas em um esquema, ponto final?
Basta selecionar em
information_schema.columns
vez disso.PARA GLÓRIA
Por qualquer motivo, se você não puder consultar
information_schema.columns
(o que, de outra forma, indicaria que algo é estranho para mim). Podemos fazer engenharia reversa dos catálogos de forma eficientepsql -E
com um usuário que pode.\
Em seguida, execute o comando client ( ) apropriadopsql
que mostra o que você deseja, como\d schema
. E copie as partes da consulta exportada que você precisa.Para mim, a coluna final é algo como
Agora só preciso pegar todos os
attrelid
's para o esquema. Correndo rápido\d asdofkodskf
eu vejo,n.nspname
Na verdade não queremosc.relname
Então, dada a minha versão do
psql
, o método oficial de consultar o catálogo diretamente seria...Trecho (sem todas as colunas ou todas as linhas) (relname é tabela, attname é coluna)