¿Por qué no puedo ver mi tabla (PostgreSQL) cuando uso \ dt (+) dentro de psql?


12

He creado la tabla donoren el esquema referencesegún:

CREATE TABLE reference.donor (
    donor_code smallint PRIMARY KEY,
    donor_name character varying NOT NULL,
    donor_type smallint REFERENCES reference.donor_type (type_id),
    alpha_2_code char(2) REFERENCES reference.iso_3166_1 (alpha_2_code)
);

He poblado la tabla según:

INSERT INTO reference.donor (donor_code, donor_name, donor_type, alpha_2_code)
SELECT donor_code, donor_name, donor_type, alpha_2_code
FROM reference.donor_template;

Cuando corro:

\dt+ reference.*

dentro de psql veo la reference.donortabla:

                          List of relations
  Schema   |      Name      | Type  |  Owner   | Size  | Description 
-----------+----------------+-------+----------+-------+-------------
 reference | donor          | table | postgres | 16 kB | 
 reference | donor_template | table | postgres | 16 kB | 
 reference | donor_type     | table | postgres | 16 kB | 
 reference | iso_3166_1     | table | postgres | 48 kB | 
(4 rows)

Pero cuando ejecuto \dt+ donor*(o \dt(+)) no veo la reference.donortabla:

                          List of relations
  Schema   |      Name      | Type  |  Owner   | Size  | Description 
-----------+----------------+-------+----------+-------+-------------
 oecd_cl   | donor          | table | postgres | 16 kB | 
 reference | donor_template | table | postgres | 16 kB | 
 reference | donor_type     | table | postgres | 16 kB | 
(3 rows)

¿Por qué solo puedo ver la reference.donortabla si ejecuto \dt+ reference.*o \dt+ *.donor?
Esperaba \dt(o \dt+) mostrarlo, pero no lo hace.

Mi search_pathincluye el esquema referencey el usuario postgrestiene todos los permisos en el esquema referencey todas las tablas en el esquema según:

GRANT ALL ON ALL TABLES IN SCHEMA reference TO postgres;

Solo para aclarar, tengo dos donortablas, pero están en dos esquemas diferentes, es decir, oecd.donor& reference.donor. (Puedo ver oecd.donorsin ningún problema cuando uso \dt(+)dentro de psql).

Respuestas:


11

La documentación en psql explica:

Cada vez patternque se omite el parámetro por completo, los \dcomandos muestran todos los objetos que son visibles en la ruta de búsqueda del esquema actual, esto es equivalente a usarlo *como patrón. (Se dice que un objeto es visible si el esquema que lo contiene está en la ruta de búsqueda y ningún objeto del mismo tipo y nombre aparece antes en la ruta de búsqueda . Esto es equivalente a la declaración de que el objeto puede ser referenciado por nombre sin esquema explícito calificación.) Para ver todos los objetos en la base de datos independientemente de la visibilidad, utilícelos *.*como patrón.

El énfasis audaz es mío.
Obviamente, tienes oecd_clantes referenceen tu ruta de búsqueda . Use esto para su propósito:

\dt *.donor*

Y obtendrás:

                          List of relations
  Schema   |      Name      | Type  |  Owner   | Size  | Description 
-----------+----------------+-------+----------+-------+-------------
 oecd_cl   | donor          | table | postgres | 16 kB | 
 reference | donor          | table | postgres | 16 kB | 
 reference | donor_template | table | postgres | 16 kB | 
 reference | donor_type     | table | postgres | 16 kB | 
(4 rows)

Ok, lo entiendo. Este es un seguimiento q: si no supiera que hay dos tablas con el mismo nombre en dos esquemas diferentes en un DB y quisiera ver todas las tablas en todos los esquemas de este DB, ¿hay un metacomando psql? eso los mostrará a todos, independientemente de qué esquema se coloque en el search_pathprimero y sin que yo sepa los nombres de la tabla / esquema de antemano? ¿O soy mejor de consultar el information schemap SELECT table_schema, table_name FROM information_schema.tables ORDER BY table_schema, table_name;. Ej .: ?
dw8547

@ user4842454: El esquema de información tiene sus propias advertencias. . Para ver todas las tablas (incluidos los catálogos del sistema), utilice las \dt *.*instrucciones de la cotización.
Erwin Brandstetter

1

El primer comando funciona porque todas las tablas enumeradas tienen 'referencia' en su esquema. El segundo comando funciona igual para 'donante'. entonces la relación "reference.iso_3166_1" no tiene ningún 'donante' en su nombre. si desea enumerar iso_3166_1, simplemente intente

    \dt+ iso*

ref: http://www.postgresql.org/docs/current/static/app-psql.html#APP-PSQL-PATTERNS


La pregunta es por qué reference | donorno aparece en la lista con el segundo comando.
ypercubeᵀᴹ

@SahapAsci: mi principal preocupación es por qué \dt(o \dt+) no enumera la tabla reference.donor. Todo está bien según la tabla reference.iso_3166_1.
dw8547
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.