Các lược đồ PostgreSQL và search_path


7

Tôi đang đọc PostgreSQL của Oreilly : Lên và chạy , và trong phần Sắp xếp cơ sở dữ liệu của bạn bằng cách sử dụng lược đồ,search_pathcó thể được đặt ở cấp cơ sở dữ liệu:

Ví dụ: nếu chúng tôi muốn tất cả các đối tượng trong contrib có thể truy cập được mà không cần chứng nhận lược đồ, chúng tôi sẽ thay đổi cơ sở dữ liệu của mình như sau:

ALTER DATABASE mydb SET search_path="$user",public,contrib;

Tuy nhiên, sau khi gõ lệnh ở trên, tôi vẫn không thể tham khảo các bảng trong lược đồ khác publicmà không đủ điều kiện:

ALTER DATABASE auth SET search_path="$user",public,staging;`
\d users

Cung cấp:

Did not find any relation named "users".

Nhưng nếu tôi sử dụng \d staging.users, nó hoạt động.

SHOW search_path;

Cung cấp:

   search_path   
----------------
 "$user",public

Có mặc định search_pathtừ postgresql.confghi đè giá trị mỗi cơ sở dữ liệu được đặt với ALTER DATABASE ... SET search_path? Nếu đó là trường hợp, việc sử dụng giá trị trên mỗi cơ sở dữ liệu là gì?


có thể bạn select * from users?
Jack nói hãy thử topanswers.xyz

Không, tôi không thể select * from usersnhưng tôi có thể select * from staging.users.
Daniel Serodio

4
Bạn đã kết nối lại với cơ sở dữ liệu của mình sau khi đặt mặc định mới cho cơ sở dữ liệu search_pathchưa? Bạn đã thử chỉ thiết lập search_pathcho kết nối của bạn?
kgrittn

Tôi chưa kết nối lại được. Kết nối lại psql đã giải quyết vấn đề của tôi, cảm ơn. Bạn sẽ viết một câu trả lời để tôi có thể đánh dấu nó là chấp nhận?
Daniel Serodio

1
@Daniel, đó không phải là lỗi cú pháp trong MySQL ("vs '). Dấu ngoặc đơn và dấu ngoặc kép được xử lý như nhau (trừ khi nó được đặt ở ANSIchế độ SQL). (Nhận xét ở đây vì bạn sẽ không thấy nó ở đó. Tôi sẽ xóa nó bình luận sau)
ypercubeᵀᴹ

Câu trả lời:


4

Trích dẫn từ SETđoạn liên quan của phần ALTER DATABASEtài liệu là "Bất cứ khi nào một phiên mới được bắt đầu sau đó trong cơ sở dữ liệu đó, giá trị được chỉ định sẽ trở thành giá trị mặc định của phiên". Vì vậy, những thay đổi sẽ có hiệu lực cho các phiên mới. Bạn chỉ cần kết nối lại.


Nếu không kết nối lại, để sửa đổi search_path trên phiên hiện tại (ví dụ như trong phiên psql của bạn), bạn có thể sử dụng SET search_path TO "$user",public,contrib;.
Matt
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.