2013-09-27 188 views
22

Tôi cần hạn chế người dùng, chỉ truy cập vào một bảng sơ đồ cụ thể. Do đó, tôi đã thử truy vấn và đăng nhập dưới dạng user1_gmail_com. Nhưng tôi đã nhận được lỗi sau khi tôi cố gắng duyệt bất kỳ bảng lược đồ nào.LRI: quyền bị từ chối đối với giản đồ user1_gmail_com tại ký tự 46

Query của tôi:

SELECT clone_schema('my_application_template_schema','user1_gmail_com'); 
CREATE USER user1_gmail_com WITH PASSWORD 'myloginpassword'; 
REVOKE ALL ON ALL TABLES IN SCHEMA user1_gmail_com FROM PUBLIC; 
GRANT SELECT ON ALL TABLES IN SCHEMA user1_gmail_com TO user1_gmail_com; 

SQL lỗi:

ERROR: permission denied for schema user1_gmail_com at character 46 
In statement: 
SELECT COUNT(*) AS total FROM (SELECT * FROM "user1_gmail_com"."organisations_table") AS sub 

Cập nhật Query làm việc:

SELECT clone_schema('my_application_template_schema','user1_gmail_com'); 
CREATE USER user1_gmail_com WITH PASSWORD 'myloginpassword'; 
REVOKE ALL ON ALL TABLES IN SCHEMA user1_gmail_com FROM PUBLIC; 
GRANT USAGE ON SCHEMA user1_gmail_com TO user1_gmail_com; 
GRANT SELECT ON ALL TABLES IN SCHEMA user1_gmail_com TO user1_gmail_com; 
+0

Vì vậy, 'clone_schema()' làm gì? –

+0

Phải mất bản sao của tất cả các bảng trong my_application_template_schema thành user1_gmail_com schema.https: //wiki.postgresql.org/wiki/Clone_schema – Ramprasad

+0

Cả 'clone_schema()' lẫn ví dụ của bạn đều không chứa câu lệnh xảy ra lỗi. Vậy câu lệnh đó tạo ra lỗi từ đâu? –

Trả lời

46

Bạn cần cấp quyền truy cập không chỉ cho các bảng trong lược đồ, mà còn cho chính lược đồ đó.

Từ manual:

By default, users cannot access any objects in schemas they do not own. To allow that, the owner of the schema must grant the USAGE privilege on the schema.

Vì vậy, hoặc làm cho người sử dụng tạo của bạn chủ sở hữu của lược đồ, hoặc cấp SỬ DỤNG trên giản đồ để người dùng này.

+14

Engstrom Great. Tôi thêm vào sau query.It hoạt động tốt. SỬ DỤNG LỚN TRÊN SCHEMA user1_gmail_com ĐẾN user1_gmail_com; – Ramprasad

22

Điều này làm tôi bối rối. Vẫn không chắc chắn tôi đang xử lý nó một cách chính xác. Chạy \h grant cho cú pháp trong psql. Dưới đây là cách tôi quản lý để người dùng và nhóm khác của tôi hoạt động khi cần:

GRANT ALL PRIVILEGES ON SCHEMA foo TO GROUP bar; 
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA foo TO GROUP bar; 
+0

Rõ ràng ngay cả 'GRANT ALL PRIVILEGES ON DATABASE xx TO yy' không ngụ ý' SỬ DỤNG LỚN TRÊN SCHEMA zz' khi 'zz' là lược đồ của cơ sở dữ liệu' xx', lạ – Jacopofar