Tại sao tôi không thể thấy bảng của mình (PostgreSQL) khi tôi sử dụng \ dt (+) trong psql?


12

Tôi đã tạo bảng donortrong lược đồ referencetheo:

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

Tôi đã điền vào bảng theo:

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;

Khi tôi chạy:

\dt+ reference.*

Bên trong psql tôi thấy reference.donorbảng:

                          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)

Nhưng khi tôi chạy \dt+ donor*(hoặc \dt(+)) tôi không thấy reference.donorbảng:

                          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)

Tại sao tôi chỉ có thể nhìn thấy reference.donorbảng nếu tôi chạy \dt+ reference.*hoặc \dt+ *.donor?
Tôi đã mong đợi \dt(hoặc \dt+) hiển thị nó, nhưng nó không.

My search_pathbao gồm lược đồ reference& người dùng postgrescó tất cả các quyền trên lược đồ referencevà tất cả các bảng trong lược đồ theo:

GRANT ALL ON ALL TABLES IN SCHEMA reference TO postgres;

Chỉ cần làm rõ, tôi có hai donorbảng, nhưng chúng ở hai lược đồ khác nhau, tức là oecd.donor& reference.donor. (Tôi có thể thấy oecd.donormà không có bất kỳ vấn đề nào khi tôi sử dụng \dt(+)bên trong psql).

Câu trả lời:


11

Các tài liệu về psql giải thích:

Bất cứ khi nào patterntham số bị bỏ qua hoàn toàn, các \dlệnh sẽ hiển thị tất cả các đối tượng có thể nhìn thấy trong đường dẫn tìm kiếm lược đồ hiện tại - điều này tương đương với việc sử dụng *làm mẫu. (Một đối tượng được cho là hiển thị nếu lược đồ chứa của nó nằm trong đường dẫn tìm kiếm và không có đối tượng cùng loại và tên xuất hiện trước đó trong đường dẫn tìm kiếm . Điều này tương đương với câu lệnh mà đối tượng có thể được tham chiếu theo tên mà không có lược đồ rõ ràng đủ điều kiện.) Để xem tất cả các đối tượng trong cơ sở dữ liệu bất kể khả năng hiển thị, hãy sử dụng *.*làm mẫu.

Nhấn mạnh đậm của tôi.
Rõ ràng, bạn có oecd_cltrước referencetrong con đường tìm kiếm của bạn . Sử dụng điều này cho mục đích của bạn:

\dt *.donor*

Và bạn sẽ nhận được:

                          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 tôi hiểu rồi. Đây là phần tiếp theo q: nếu tôi không biết rằng có hai bảng có cùng tên trong hai lược đồ khác nhau trong một DB và muốn xem tất cả các bảng trong tất cả các lược đồ trong DB này, thì có lệnh meta psql không điều đó sẽ hiển thị tất cả, bất kể lược đồ nào được đặt ở search_pathđầu tiên và không có tôi biết trước tên bảng / lược đồ? Hoặc tôi tốt hơn là truy vấn information schemaví dụ ,: SELECT table_schema, table_name FROM information_schema.tables ORDER BY table_schema, table_name;?
dw8547

@ user4842454: Lược đồ thông tin có thông báo riêng. . Để xem tất cả các bảng (bao gồm các danh mục hệ thống) sử dụng \dt *.*theo hướng dẫn trong báo giá.
Erwin Brandstetter

1

Lệnh đầu tiên hoạt động vì tất cả các bảng được liệt kê có 'tham chiếu' trong lược đồ của chúng. Lệnh thứ hai hoạt động tương tự cho 'nhà tài trợ'. do đó, mối quan hệ "Reference.iso_3166_1" không có bất kỳ "nhà tài trợ" nào trong tên của nó. nếu bạn muốn liệt kê iso_3166_1 thì hãy thử

    \dt+ iso*

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


Câu hỏi là tại sao reference | donorkhông được liệt kê với lệnh 2.
ypercubeᵀᴹ

@SahapAsci: mối quan tâm chính của tôi là về lý do tại sao \dt(hoặc \dt+) không liệt kê bảng Reference.donor . Tất cả đều ổn theo bảng tham chiếu.iso_3166_1.
dw8547
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.