Search_path cho một cơ sở dữ liệu và người dùng nhất định là gì?


44

Tôi có thể thấy hiện tại search_pathvới:

show search_path ;

Và tôi có thể thiết lập search_pathcho phiên hiện tại với:

set search_path = "$user", public, postgis;

Đồng thời, tôi có thể thiết lập vĩnh viễn cơ sở dữ liệu đãsearch_path cho bằng:

alter database mydb set search_path = "$user", public, postgis ;

Và tôi vĩnh viễn có thể thiết lập search_pathcho một cho vai diễn (người dùng) với:

alter role johnny set search_path = "$user", public, postgis ;

Nhưng tôi muốn biết làm thế nào để xác định cơ sở dữ liệu và cài đặt vai trò là gì (liên quan đến search_path) trước khi thay đổi chúng?

Câu trả lời:


36

Bạn có thể tìm thấy cài đặt cấu hình cho vai trò và cơ sở dữ liệu trong bảng danh mục pg_db_role_setting.

Truy vấn này lấy bất kỳ cài đặt nào cho một vai trò hoặc cơ sở dữ liệu nhất định:

SELECT r.rolname, d.datname, rs.setconfig
FROM   pg_db_role_setting rs
LEFT   JOIN pg_roles      r ON r.oid = rs.setrole
LEFT   JOIN pg_database   d ON d.oid = rs.setdatabase
WHERE  r.rolname = 'myrole' OR d.datname = 'mydb';

Nếu không có gì được đặt, phiên bản thấp hơn tiếp theo sẽ xác định trạng thái mặc định của search_path, postgresql.conftrong trường hợp này hoặc tùy chọn dòng lệnh khi máy chủ khởi động. Liên quan:

Để bỏ đặt bất kỳ cài đặt nào của vai trò hoặc cơ sở dữ liệu - search_pathtrong ví dụ cụ thể này:

ALTER ROLE myrole RESET search_path;

Hoặc là:

ALTER DATABASE mydb RESET search_path;

Hoặc là:

ALTER ROLE myrole in DATABASE mydb RESET search_path;

Không bao giờ thao tác dữ liệu trong danh mục hệ thống ( pg_catalog.*) theo cách thủ công. Sử dụng các lệnh DDL theo hướng dẫn trong hướng dẫn cho ALTER ROLEALTER DATABASE.
Về cơ bản, RESETlệnh xóa một hàng khỏi pg_db_role_settingcho phép cài đặt cơ sở có hiệu lực trở lại. Tôi sẽ không gọi đó là hỗn độn.


Ồ Tôi đã không tưởng tượng nó sẽ là phức tạp này. Làm thế nào bạn sẽ bỏ đặt một cơ sở dữ liệu và thiết lập vai trò nhất định? Sau khi thực hiện alter role myrole set search_path = "$user", public, postgis ;tôi nhận thấy rằng pg_roles.rolconfig(tương ứng với vai trò của tôi) đã nhận được giá trị {"search_path=\"$user\", public, postgis"}. Ngoài ra, select * from pg_db_role_setting ;bây giờ cho thấy một hàng bổ sung. Và sau khi thực hiện, alter database mydb set search_path = "$user", public, postgis ;tôi thấy một hàng tương ứng select * from pg_db_role_setting ;- cuối cùng, tôi không chắc chắn làm thế nào để "hoàn tác" những thay đổi này.
dùng664833

@ user664833: Tôi đã thêm hướng dẫn để bỏ đặt.
Erwin Brandstetter

6

Các cài đặt cố định cho cả cơ sở dữ liệu và vai trò được lưu trữ trong bảng toàn cụm hệ thống pg_db_role_sinstall .

Chỉ có cài đặt thay đổi là hiện tại. Nếu đường dẫn tìm kiếm không bao giờ được sửa đổi cho cơ sở dữ liệu hoặc vai trò, tôi đoán nó có thể được giả định là "$user",public.

  • Giá trị của cài đặt trước bất kỳ thay đổi nào, bao gồm ở cấp cụm (thông qua cấu hình toàn cầu postgresql.conf) có thể được truy vấn từ cơ sở dữ liệu với:

     SELECT boot_val FROM pg_settings WHERE name='search_path';
  • Giá trị của cài đặt trước bất kỳ thay đổi nào trong phiên (thông qua SETlệnh) có thể được truy vấn từ cơ sở dữ liệu với:

     SELECT reset_val FROM pg_settings WHERE name='search_path';
  • Khi đặt giá trị không mặc định postgresql.conf, không đơn giản để có được giá trị đó trong SQL độc lập với phiên hiện tại . pg_settings.boot_valsẽ không làm vì nó bỏ qua các thay đổi trong tệp cấu hình và pg_settings.reset_valcũng sẽ không, vì nó bị ảnh hưởng bởi các cài đặt cơ sở dữ liệu / người dùng có khả năng được đặt qua ALTER USER/ALTER DATABASE. Cách đơn giản nhất để một DBA nhận được giá trị là chỉ cần tra cứu nó postgresql.conf. Mặt khác, xem Đặt lại search_path thành toàn cầu, mặc định cụm bao gồm chủ đề này một cách chi tiết.


Không boot_valthực sự là mặc định của nhà máy được biên dịch, không phải là cài đặt trong postgresql.conf?
Erwin Brandstetter

@Erwin: vâng. Người ta có thể muốn nhìn vào reset_valthay vì boot_val.
Daniel Vérité

Hmm, cơ sở dữ liệu hoặc cài đặt vai trò ghi đè giá trị trong reset_val. Tôi tình cờ phát hiện ra câu hỏi cũ này khi nghiên cứu câu hỏi gần đây này: dba.stackexchange.com/questions/145280/ mẹo
Erwin Brandstetter

@Erwin: ISTM nhận được giá trị từ postgresql.conf có thể là một vấn đề XY trong hầu hết các trường hợp. Dù sao, tôi đã chỉnh sửa câu trả lời để liên kết đến câu hỏi mới hơn và mở rộng một chút.
Daniel Vérité

3
select * from pg_user;

Đúng cho postgres và Redshift. Điều này có vẻ quá đơn giản so với các câu trả lời trước đó phụ thuộc vào pg_db_role_setting, nhưng useconfigcột sẽ có một danh sách các cấu hình người dùng bao gồm search_path, được định dạng dưới dạng danh sách.

pg_user Tài liệu Postgres ở đây

Để được lựa chọn nhiều hơn:

rs.db.batarang.com cooldb:cooldude =#> select usename
                                              , useconfig 
                                       from   pg_user
                                       where  usename = 'cooldude';
┌────────────┬─────────────────────────────────────────────────────┐
  usename                         useconfig                      
├────────────┼─────────────────────────────────────────────────────┤
 cooldude    {"search_path=dirt, test, \"$user\", public, prod"} 
└────────────┴─────────────────────────────────────────────────────┘

Tôi nghĩ bảng người dùng này chứa tất cả người dùng trong cụm, không chỉ db cụ thể - nhưng tôi đã không xác minh điều đó.


Vai trò không giống hệt như người dùng. ;)
Vic

Vic có thể giải thích? Tài liệu Postgres ngắn gọn và dường như nói rằng người dùng và vai trò không còn là khái niệm riêng biệt, nhưng tôi không phải là một DBA và sẽ thích đầu vào hơn. postgresql.org/docs/civerse/static/user-manag.html
Merlin

2
Bất kỳ "vai trò" nào cũng có thể hoạt động như một người dùng, một nhóm hoặc cả hai. Nhưng một người dùng 'được ngụ ý có một sự khác biệt khác. Xem xét danh mục chúng tôi thấy rằng các khung nhìn pg_role và pg_user đều có bảng tham chiếu pg_authid, nhưng với rolcanlogin vị ngữ cho người dùng. 'Người dùng có thể đăng nhập vào cơ sở dữ liệu của bạn và nói chung là' vai trò 'xác định các nhóm ủy quyền mà người dùng kế thừa.
Vic
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.