AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 35497
Accepted
navige
navige
Asked: 2013-02-27 10:13:25 +0800 CST2013-02-27 10:13:25 +0800 CST 2013-02-27 10:13:25 +0800 CST

Exibir tipos definidos pelo usuário e seus detalhes

  • 772

Eu criei alguns novos UDTs no PostgreSQL. No entanto, agora tenho dois problemas:

  1. como ver quais UDTs foram definidas?
  2. como ver as colunas definidas dentro desses UDTs?

Infelizmente, não encontrei nada sobre isso na documentação do PostgreSQL.

postgresql user-defined-type
  • 6 6 respostas
  • 47095 Views

6 respostas

  • Voted
  1. Best Answer
    gsiems
    2013-02-27T13:14:24+08:002013-02-27T13:14:24+08:00

    Isso faz você começar?

    SELECT n.nspname AS schema,
            pg_catalog.format_type ( t.oid, NULL ) AS name,
            t.typname AS internal_name,
            CASE
                WHEN t.typrelid != 0
                THEN CAST ( 'tuple' AS pg_catalog.text )
                WHEN t.typlen < 0
                THEN CAST ( 'var' AS pg_catalog.text )
                ELSE CAST ( t.typlen AS pg_catalog.text )
            END AS size,
            pg_catalog.array_to_string (
                ARRAY( SELECT e.enumlabel
                        FROM pg_catalog.pg_enum e
                        WHERE e.enumtypid = t.oid
                        ORDER BY e.oid ), E'\n'
                ) AS elements,
            pg_catalog.obj_description ( t.oid, 'pg_type' ) AS description
        FROM pg_catalog.pg_type t
        LEFT JOIN pg_catalog.pg_namespace n
            ON n.oid = t.typnamespace
        WHERE ( t.typrelid = 0
                OR ( SELECT c.relkind = 'c'
                        FROM pg_catalog.pg_class c
                        WHERE c.oid = t.typrelid
                    )
            )
            AND NOT EXISTS
                ( SELECT 1
                    FROM pg_catalog.pg_type el
                    WHERE el.oid = t.typelem
                        AND el.typarray = t.oid
                )
            AND n.nspname <> 'pg_catalog'
            AND n.nspname <> 'information_schema'
            AND pg_catalog.pg_type_is_visible ( t.oid )
        ORDER BY 1, 2;
    

    No psql você pode \set ECHO_HIDDEN onfazer com que o psql mostre as consultas usadas para gerar a saída dos \d...comandos. Descobri que essas consultas são muito úteis como ponto de partida ao extrair metadados de bancos de dados.

    Atualização: 16/12/2019

    Para tipos compostos, os metadados das colunas podem ser determinados usando algo como o seguinte:

    WITH types AS (
        SELECT n.nspname,
                pg_catalog.format_type ( t.oid, NULL ) AS obj_name,
                CASE
                    WHEN t.typrelid != 0 THEN CAST ( 'tuple' AS pg_catalog.text )
                    WHEN t.typlen < 0 THEN CAST ( 'var' AS pg_catalog.text )
                    ELSE CAST ( t.typlen AS pg_catalog.text )
                    END AS obj_type,
                coalesce ( pg_catalog.obj_description ( t.oid, 'pg_type' ), '' ) AS description
            FROM pg_catalog.pg_type t
            JOIN pg_catalog.pg_namespace n
                ON n.oid = t.typnamespace
            WHERE ( t.typrelid = 0
                    OR ( SELECT c.relkind = 'c'
                            FROM pg_catalog.pg_class c
                            WHERE c.oid = t.typrelid ) )
                AND NOT EXISTS (
                        SELECT 1
                            FROM pg_catalog.pg_type el
                            WHERE el.oid = t.typelem
                            AND el.typarray = t.oid )
                AND n.nspname <> 'pg_catalog'
                AND n.nspname <> 'information_schema'
                AND n.nspname !~ '^pg_toast'
    ),
    cols AS (
        SELECT n.nspname::text AS schema_name,
                pg_catalog.format_type ( t.oid, NULL ) AS obj_name,
                a.attname::text AS column_name,
                pg_catalog.format_type ( a.atttypid, a.atttypmod ) AS data_type,
                a.attnotnull AS is_required,
                a.attnum AS ordinal_position,
                pg_catalog.col_description ( a.attrelid, a.attnum ) AS description
            FROM pg_catalog.pg_attribute a
            JOIN pg_catalog.pg_type t
                ON a.attrelid = t.typrelid
            JOIN pg_catalog.pg_namespace n
                ON ( n.oid = t.typnamespace )
            JOIN types
                ON ( types.nspname = n.nspname
                    AND types.obj_name = pg_catalog.format_type ( t.oid, NULL ) )
            WHERE a.attnum > 0
                AND NOT a.attisdropped
    )
    SELECT cols.schema_name,
            cols.obj_name,
            cols.column_name,
            cols.data_type,
            cols.ordinal_position,
            cols.is_required,
            coalesce ( cols.description, '' ) AS description
        FROM cols
        ORDER BY cols.schema_name,
                cols.obj_name,
                cols.ordinal_position ;
    
    • 32
  2. Erwin Brandstetter
    2013-02-27T16:32:48+08:002013-02-27T16:32:48+08:00

    Os clientes padrão têm funcionalidade para cobrir isso:

    pgAdmin 4

    GUI padrão.

    tipos em pgAdmin4

    Certifique-se de que os tipos estejam habilitados no navegador de objetos: Arquivo - Preferências - Navegador - Nós .

    À esquerda, você vê os tipos definidos pelo usuário no esquema escolhido. (Pergunta 1 )

    O SQL paneà direita tem o script SQL de engenharia reversa para o tipo selecionado. (Pergunta 2 )

    Mais detalhes nos outros painéis, como Dependentsetc.

    psql

    O console interativo padrão.

    1. \dTpara obter uma lista de tipos definidos pelo usuário.
    2. \d type_namepara obter a lista de definição de coluna para o tipo fornecido.

    O manual:

    \d[S+] [ pattern ]

    Para cada relação (tabela, visão, visão materializada, índice, sequência ou tabela estrangeira) ou tipo de composição correspondente ao padrão , mostre todas as colunas, seus tipos, [...]

    Minha ênfase em negrito. O comando também funciona para tipos compostos desde pelo menos o Postgres 9.1.

    E:

    \dT[S+] [ pattern ]

    Lista os tipos de dados. Se o padrão for especificado, apenas os tipos cujos nomes correspondem ao padrão serão listados. Se +for anexado ao nome do comando, cada tipo será listado com seu nome e tamanho internos, seus valores permitidos se for um enumtipo e suas permissões associadas. Por padrão, apenas objetos criados pelo usuário são mostrados; forneça um padrão ou o Smodificador para incluir objetos do sistema.

    • 22
  3. Santos L. Victor
    2019-06-04T10:59:25+08:002019-06-04T10:59:25+08:00

    Tente executar este código:

    SELECT
        pg_type.typname, 
         pg_enum.enumlabel
    FROM
        pg_type 
    JOIN
        pg_enum ON pg_enum.enumtypid = pg_type.oid;
    
    • 10
  4. jgrocha
    2019-12-21T14:01:06+08:002019-12-21T14:01:06+08:00

    Esta é uma alternativa muito simples , mas suficiente para casos de uso simples. Quando o tipo da coluna é UDT, usamos a udt_namecoluna da information_schema.columnstabela.

    select column_name, case 
            when (data_type = 'USER-DEFINED') then udt_name 
            else data_type 
        end as data_type
    from information_schema.columns 
    where table_schema = 'altimetria' and table_name = 'cnivel';
    

    Resultado ( geometryé um UDT):

     column_name  |    data_type     
    --------------+------------------
     ogc_fid      | integer
     wkb_geometry | geometry
     id_cnivel    | bigint
     cod_cart     | bigint
     cod_fam      | bigint
     cod_sub      | integer
     z            | double precision
     shape_len    | double precision
    
    • 4
  5. Eric
    2021-10-28T01:07:15+08:002021-10-28T01:07:15+08:00

    Com psql:

    • \dTmostre a lista de tipos definidos pelo usuário.
    • \dT+ <type_name>mostre determinado tipo definido pelo usuário, com detalhes.
    • \dT <type_name>mostre determinado tipo definido pelo usuário, sem detalhes.
    • 0
  6. P. Qualis
    2021-12-01T04:50:08+08:002021-12-01T04:50:08+08:00

    Usando a resposta de gsiems , arquivei o objetivo de imitar o 'CREATE TYPE' em PgAdmin & PgBackup

    WITH types AS (
        SELECT n.nspname,
                pg_catalog.format_type ( t.oid, NULL ) AS obj_name,
                CASE
                    WHEN t.typrelid != 0 THEN CAST ( 'tuple' AS pg_catalog.text )
                    WHEN t.typlen < 0 THEN CAST ( 'var' AS pg_catalog.text )
                    ELSE CAST ( t.typlen AS pg_catalog.text )
                    END AS obj_type,
                coalesce ( pg_catalog.obj_description ( t.oid, 'pg_type' ), '' ) AS description
            FROM pg_catalog.pg_type t
            JOIN pg_catalog.pg_namespace n
                ON n.oid = t.typnamespace
            WHERE ( t.typrelid = 0
                    OR ( SELECT c.relkind = 'c'
                            FROM pg_catalog.pg_class c
                            WHERE c.oid = t.typrelid ) )
                AND NOT EXISTS (
                        SELECT 1
                            FROM pg_catalog.pg_type el
                            WHERE el.oid = t.typelem
                            AND el.typarray = t.oid )
                AND n.nspname <> 'pg_catalog'
                AND n.nspname <> 'information_schema'
                AND n.nspname !~ '^pg_toast'
    ),
    cols AS (
        SELECT n.nspname::text AS schema_name,
                pg_catalog.format_type ( t.oid, NULL ) AS obj_name,
                a.attname::text AS column_name,
                pg_catalog.format_type ( a.atttypid, a.atttypmod ) AS data_type,
                a.attnotnull AS is_required,
                a.attnum AS ordinal_position,
                pg_catalog.col_description ( a.attrelid, a.attnum ) AS description
            FROM pg_catalog.pg_attribute a
            JOIN pg_catalog.pg_type t
                ON a.attrelid = t.typrelid
            JOIN pg_catalog.pg_namespace n
                ON ( n.oid = t.typnamespace )
            JOIN types
                ON ( types.nspname = n.nspname
                    AND types.obj_name = pg_catalog.format_type ( t.oid, NULL ) )
            WHERE a.attnum > 0
                AND NOT a.attisdropped
    )
    SELECT 'CREATE TYPE ' || cols.schema_name || '.' || cols.obj_name || E' AS (\n    ' ||
        pg_catalog.array_to_string (ARRAY( 
            SELECT cols.column_name || ' ' || cols.data_type AS col_num_typ
            FROM cols
            WHERE cols.obj_name='my_user_datatype'
            ORDER BY cols.schema_name,
                    cols.obj_name,
                    cols.ordinal_position ), E',\n    '
            ) || E'\n);'
        AS cre_typ
    FROM cols
    WHERE cols.obj_name='my_user_datatype'
    LIMIT 1
    

    e execute-o no psql com estes comandos para ter apenas o código SQL \t\a\g\a\t.

    Ok em PG 9.6. Diga-me se está sendo executado com suas instâncias. Obviamente, ele precisa ser otimizado e testado.

    • 0

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve