Pourquoi ne puis-je pas voir ma table (PostgreSQL) lorsque j'utilise \ dt (+) dans psql?


12

J'ai créé la table donordans le schéma referenceselon:

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)
);

J'ai rempli le tableau selon:

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;

Quand je cours:

\dt+ reference.*

à l'intérieur de psql, je vois le reference.donortableau:

                          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)

Mais quand je cours \dt+ donor*(ou \dt(+)) je ne vois pas le reference.donortableau:

                          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)

Pourquoi ne puis-je voir le reference.donortableau que si je lance \dt+ reference.*ou \dt+ *.donor?
Je m'attendais \dt(ou \dt+) à l'afficher, mais ce n'est pas le cas.

Mon search_pathinclut le schéma referenceet l'utilisateur postgresa toutes les autorisations sur le schéma referenceet toutes les tables du schéma selon:

GRANT ALL ON ALL TABLES IN SCHEMA reference TO postgres;

Juste pour clarifier, j'ai deux donortableaux, mais ils sont dans deux schémas différents à savoir, oecd.donor& reference.donor. (Je peux voir oecd.donorsans aucun problème lorsque j'utilise l' \dt(+)intérieur de psql).

Réponses:


11

La documentation sur psql explique:

Chaque fois que le patternparamètre est complètement omis, les \dcommandes affichent tous les objets qui sont visibles dans le chemin de recherche de schéma actuel - cela équivaut à utiliser *comme modèle. (Un objet est dit visible si son schéma contenant se trouve dans le chemin de recherche et qu'aucun objet du même type et du même nom n'apparaît plus tôt dans le chemin de recherche . Cela équivaut à la déclaration selon laquelle l'objet peut être référencé par son nom sans schéma explicite qualification.) Pour voir tous les objets dans la base de données indépendamment de la visibilité, utilisez *.*comme modèle.

Accentuation sur moi.
De toute évidence, vous avez oecd_cldéjà referencedans votre chemin de recherche . Utilisez ceci pour votre but:

\dt *.donor*

Et vous obtiendrez:

                          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, je comprends. Ceci est un suivi q: si je ne savais pas qu'il y a deux tables avec le même nom dans deux schémas différents dans une base de données et que je voulais voir toutes les tables dans tous les schémas de cette base de données, y a-t-il une méta-commande psql qui les affichera tous, quel que soit le schéma placé dans le search_pathpremier et sans que je sache à l'avance les noms des tables / schémas? Ou suis-je mieux de demander information schemapar exemple,: SELECT table_schema, table_name FROM information_schema.tables ORDER BY table_schema, table_name;?
dw8547

@ user4842454: Le schéma d'information a ses propres mises en garde. . Pour voir toutes les tables (y compris les catalogues système), utilisez \dt *.*comme indiqué dans le devis.
Erwin Brandstetter

1

La première commande fonctionne car toutes les tables répertoriées ont une «référence» dans leur schéma. La deuxième commande fonctionne de la même manière pour «donneur». la relation "reference.iso_3166_1" n'a donc pas de "donneur" dans son nom. si vous souhaitez répertorier iso_3166_1, essayez simplement

    \dt+ iso*

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


La question est de savoir pourquoi reference | donorn'est pas répertorié avec la 2e commande.
ypercubeᵀᴹ

@SahapAsci: ma principale préoccupation est de savoir pourquoi \dt(ou \dt+) ne répertorie pas la table reference.donor. Tout va bien selon le tableau reference.iso_3166_1.
dw8547
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.