2012-01-19 19 views
35

Tôi muốn nhận danh sách người dùng cho một cơ sở dữ liệu nhất định trong psql - ví dụ: "template0". Ai là người dùng? Hoặc cho cơ sở dữ liệu "template1": - người dùng ở đó là ai?Danh sách người dùng PostgreSQL

Đã thử:

\du+ -- no database is Listed not Users 
Select * from "pg_users"; -- no database is listed 

Trả lời

71

người dùng là không thực sự "đối với cơ sở dữ liệu", họ đang cho cụm và được trao quyền khác nhau để cơ sở dữ liệu truy cập. Để liệt kê người dùng \du nên làm, nhưng bạn cần phải được kết nối. Một cái gì đó như

psql template1 -c '\du' 

từ lời nhắc dòng lệnh nên làm. (hoặc \du từ lời nhắc ps2 khi bạn được kết nối với cơ sở dữ liệu).

+0

@ Michael, cảm ơn rất nhiều sự trợ giúp. –

+0

Bạn được chào đón. –

12

Bạn phải hiểu rằng trong người dùng PostgreSQL là cho mỗi cụm cơ sở dữ liệu. @ Michael đã chứng minh làm thế nào để có được một danh sách những người. Vì vậy, trừ khi bạn hạn chế quyền đối với một cơ sở dữ liệu cụ thể một cách rõ ràng với REVOKEGRANT, tất cả người dùng trong cụm có quyền truy cập cơ bản vào bất kỳ cơ sở dữ liệu nào trong cụm.

Để xác định, cho dù một cụ dùng thực sự có một đặc ân nào đó ('CONNECT') cho một cơ sở dữ liệu:

has_database_privilege(user, database, privilege) 

Thông tin thêm về privilege functions in the manual.

Để xác định tất cả các đặc quyền cụ thể cho một cụ thể cơ sở dữ liệu:

SELECT datname, datacl 
FROM pg_database 
WHERE datname = 'mydb'; 

Bạn nhận được NULL cho datacl nếu không có hạn chế cụ thể được áp dụng.


Ngoài ra, bạn có thể giới hạn quyền truy cập cho mỗi cơ sở dữ liệu và cho mỗi người dùng trong tệp pg_hba.conf. Đó là ở cấp độ thấp hơn. Người dùng thậm chí không thể kết nối, nếu pg_hba.conf sẽ không cho phép anh ta, ngay cả khi cơ sở dữ liệu chính nó sẽ cho phép truy cập.

+0

@ Erwin, @ Michael, cảm ơn một tấn vì sự giúp đỡ. –

+2

Cũng lưu ý, trên các phiên bản gần đây, bạn có thể cấp/thu hồi các đặc quyền CONNECT đối với db. –

3

Để liệt kê vai trò/người dùng

chọn rolname từ pg_roles;