2011-06-23 34 views
16

Tôi muốn tạo một người dùng chỉ với đặc quyền lựa chọn cho tất cả các bảng trong tất cả các cơ sở dữ liệu. Tôi nghĩ rằng tôi có thể có được một danh sách các cơ sở dữ liệu và áp dụng các lệnh sau đây cho mỗi cơ sở dữ liệu:Làm thế nào để tạo một người dùng có đặc quyền chỉ đọc cho tất cả các cơ sở dữ liệu trong Postgresql?

GRANT select ON DATABASE dbname to user1; 

Nhưng tôi đã nhận lỗi sau:

ERROR: invalid privilege type SELECT for database 

Khi tôi googled người khuyên nên làm các hoạt động grant select cho tất cả các bảng. Nhưng các bảng mới sẽ luôn được thêm vào. Vì vậy, đây không phải là một giải pháp chấp nhận được đối với tôi. Có ai biết cách giải quyết nào không?

+0

@Jonas thực sự đây là SQL cơ bản, vì vậy không phù hợp cho DBA - http: //dba.stackexchange.com/faq – Stefano

Trả lời

17

Bạn không thể làm điều này trên mức cơ sở dữ liệu, chỉ trên mức schema.

Giả sử bạn chỉ sử dụng giản đồ public trong mỗi cơ sở dữ liệu, bạn có thể làm điều này:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1; 
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO user; 
+2

Tuyên bố của bạn rằng điều này sẽ áp dụng cho các bảng và khung nhìn mới được tạo không chính xác - "TẤT CẢ CÁC BẢNG" chỉ đơn giản là ngắn gọn để chạy lệnh GRANT SELECT trên mỗi bảng hiện có và không đặt bất kỳ giá trị mặc định nào. Để đặt mặc định cho các đối tượng mới, bạn cần lệnh ALTER DEFAULT PRIVILEGES: http://www.postgresql.org/docs/current/static/sql-alterdefaultprivileges.html (Xem câu trả lời của tôi dưới đây) – IMSoP

+0

@IMSoP: cảm ơn vì đã trỏ mà ra! –

+0

Câu hỏi ban đầu là về chủ đề SELECt cho tất cả các bảng và cho TẤT CẢ cơ sở dữ liệu. Điều này là có thể trong mysql nhưng (tôi nghĩ) không thể trong postgres. Trong postgres người ta phải cấp các quyền này cho từng cơ sở dữ liệu một cách độc lập. Có thể bạn có thể thêm điều này làm rõ (hoặc sửa tôi nếu có thể). – Michael

4

Tôi nhận ra bạn đã nói rằng đây không phải là câu trả lời có thể chấp nhận được, nhưng đó là câu trả lời đúng.

Chỉ định bảo mật (GRANT và REVOKE) là một phần của thiết kế và thử nghiệm bảng.

Không di chuyển bảng sang sản xuất trước khi định nghĩa bảng, bảo mật, kiểm tra và dữ liệu thử nghiệm đang được kiểm soát phiên bản.

Có nói rằng, PostgreSQL không có bất kỳ quyền SELECT nào trên cơ sở dữ liệu. Bạn chỉ có thể cấp quyền CREATE, CONNECT hoặc TEMP trên cơ sở dữ liệu.

Bạn có thể cấp SELECT trên tất cả các bảng trong một lược đồ đã cho. Tôi không biết làm thế nào mà ảnh hưởng đến các bảng được tạo ra sau khi chạy câu lệnh GRANT, nhưng nó khá dễ dàng để kiểm tra.

PostgreSQL Grant syntax

21

Bạn cần phải làm 2 điều: thứ nhất, cho phép truy cập vào các đối tượng hiện có; và thứ hai, đặt quyền truy cập mặc định cho các đối tượng mới được tạo từ bây giờ trở đi. Lưu ý rằng cấp quyền truy cập vào "BẢNG" bao gồm các chế độ xem, nhưng không bao gồm các chuỗi (chẳng hạn như chức năng tăng tự động cho cột "SERIAL"), vì vậy, bạn có thể cũng muốn cấp quyền truy cập cho các cột đó.

Dưới đây giả định bạn muốn thực hiện mọi thứ trong lược đồ public. Câu lệnh ALTER DEFAULT PRIVILEGES có thể hoạt động trên toàn bộ cơ sở dữ liệu bằng cách bỏ qua mệnh đề IN SCHEMA ...; GRANT phải được chạy một lần cho mỗi lược đồ.

-- Grant access to current tables and views 
GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1; 
-- Now make sure that's also available on new tables and views by default 
ALTER DEFAULT PRIVILEGES 
    IN SCHEMA public -- omit this line to make a default across all schemas 
    GRANT SELECT 
ON TABLES 
TO user1; 

-- Now do the same for sequences 
GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO user1; 
ALTER DEFAULT PRIVILEGES 
    IN SCHEMA public -- omit this line to make a default across all schemas 
    GRANT SELECT, USAGE 
ON SEQUENCES 
TO user1; 

PostgreSQL thủ

+0

đủ kỳ quặc Tôi cần 'cấp sử dụng trên lược đồ công khai cho user1;' cũng như –

3

Đối với phiên bản Postgres thấp hơn 9.0:

psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || tablename || ' TO USER;' 
FROM pg_tables WHERE schemaname = 'public'" | psql -d DBNAME 

psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || viewname || ' TO USER;' 
FROM pg_views WHERE schemaname = 'public'" | psql -d DBNAME 

psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || relname || ' TO USER;' 
FROM pg_statio_all_sequences WHERE schemaname = 'public'" | psql -d DBNAME 
+0

tôi phải làm 'psql -d DBNAME -qAt -c" SELECT 'GRANT SELECT ON '|| relname ||' ĐẾN USER; ' FROM pg_statio_all_tables WHERE schemaname = 'public' "| psql -d DBNAME' – tymik

Các vấn đề liên quan