2012-07-22 25 views
10

Làm cách nào để tôi chuyển sang cấp DML (SELECT, INSERT, UPDATE, DELETE) trên tất cả các bảng trong lược đồ trong PostgreSQL 8.4? Tôi cũng muốn khoản trợ cấp này tồn tại để tạo bảng mới trong tương lai.PostgreSQL 8.4 cấp các đặc quyền DML trên tất cả các bảng cho một vai trò

Tôi đã xem giải pháp cho 9,0 nhưng tôi bị mắc kẹt với 8.4 vì nó được gửi cùng với Debian ổn định.

Tôi đã thử những điều sau đây làm cơ sở nhưng nó không hoạt động, kết quả là không thể tránh khỏi "quyền truy cập vào mối quan hệ X bị từ chối":

GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser; 

Tôi đã nạo vét thông qua các tài liệu hướng dẫn và tôi không thể dường như tìm một giải pháp phù hợp.

+0

Tại sao bạn không thể nâng cấp? Chắc chắn phải có một cách để nâng cấp PostgreSQL. Tất cả các phiên bản hiện tại có thể được tải xuống từ trang web của Postgres. –

+0

Có những cách chắc chắn để nâng cấp, nhưng tôi không muốn các gói do nhà cung cấp cung cấp được tích hợp, kiểm tra và hiểu rõ. Kế hoạch của chúng tôi là lên đến 9,1 cùng một lúc Debian wheezy được tuyên bố là ổn định. – pointyhat

+0

Tôi sẽ không bao giờ hiểu tại sao một số hệ điều hành bảo trợ cho người dùng nhiều như vậy. –

Trả lời

21

Tôi cũng muốn khoản trợ cấp này tiếp tục tồn tại để tạo bảng mới trong tương lai. [...] Tôi đã nạo vét tài liệu và tôi dường như không tìm được giải pháp phù hợp.

Bởi vì trước đó 9.0 không có. Tất cả những gì bạn có thể nhận được là đặt các quyền cho các bảng hiện có. Bạn phải thực hiện một GRANT cho mỗi bảng, vì trước đó 9.0 không có chế độ "hàng loạt". Xem các ngữ pháp SQL cho 8.49.0:

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } 
    [,...] | ALL [ PRIVILEGES ] } 
    ON [ TABLE ] tablename [, ...] 
    TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ] 

và 9.0 ở đây:

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } 
    [,...] | ALL [ PRIVILEGES ] } 
    ON { [ TABLE ] table_name [, ...] 
     | ALL TABLES IN SCHEMA schema_name [, ...] } 
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] 

Các ALL TABLES IN SCHEMA phần mới là một trong những bạn đang thiếu.

Ngoài ra: Đặt quyền trên cấp cơ sở dữ liệu như trong câu hỏi của bạn sẽ không giúp bạn: Bạn sẽ "chỉ" đặt quyền trên cơ sở dữ liệu của mình chứ không phải trên bất kỳ nội dung "chứa" nào như bảng. Các phần có liên quan:

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } 
    ON DATABASE dbname [, ...] 
    TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ] 

Có nghĩa là bạn chỉ có thể đặt CREATE, CONNECTTEMP quyền truy cập vào cơ sở dữ liệu riêng của mình nhưng không có SELECT, INSERT, vv


Cho đến nay cho những thứ xấu. Những gì bạn có thể làm là những điều sau đây:

  • Giảm số lượng quản lý cho phép bằng cách cấp quyền không cho người dùng nhưng để vai trò. Sau đó, thêm vai trò cho từng người dùng. Khi một bảng mới được tạo, bạn chỉ cần điều chỉnh một hoặc hai vai trò, nhưng không cần phải có hàng trăm người dùng.

  • Truy vấn danh mục hệ thống và tạo các lệnh GRANT thích hợp. Lưu chúng vào một tập tin và thực thi tập tin đó. Điều này sẽ giúp bạn khởi động dễ dàng hơn.

một truy vấn như vậy có thể trông như thế này:

select 'GRANT ALL ON ' || table_schema || '.' || table_name ||' to my_group;' 
from information_schema.tables 
where 
    table_type = 'BASE TABLE' and 
    table_schema not in ('pg_catalog', 'information_schema'); 
+0

Cảm ơn câu trả lời - điều đó giải thích hoàn hảo! – pointyhat

+0

Rõ ràng hơn và đầy đủ hơn câu trả lời của tôi, cảm ơn. –

+0

Thật không may là nó không cấp quyền truy cập cho các chuỗi - và đó là những quyền thường có ích. – Calimo

2

Tài trợ trong PostgreSQL không đệ quy; một GRANT trên cơ sở dữ liệu bộ quyền đối với đối tượng cơ sở dữ liệu nhưng không ảnh hưởng đến các lược đồ chứa hoặc bảng của họ, quan điểm, chức năng, vv

Cấp ALL PRIVELEGES về các tài trợ cơ sở dữ liệu CREATE, CONNECTTEMPORARY quyền.

Xem \h GRANT trong psql, hoặc the documentation for GRANT in 8.4, để xem những gì ALL PRIVILEGES nghĩa cho DATABASE:

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } 
    ON DATABASE database_name [, ...] 
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] 

Có chức năng plpgsql và các kịch bản bên thứ 3 khác nhau có sẵn mà sử dụng pg_catalog hoặc information_schema để tự động xây dựng GRANT s và đệ quy định quyền. Tìm kiếm "postgresql recursive grant".

Điều này sẽ không giúp bạn đặt quyền truy cập mặc định cho mới bảng. PostgreSQL doe có ALTER DEFAULT PRIVILEGES để cho phép bạn đặt quyền bảng mặc định cho các bảng mới, nhưng nó chỉ được hỗ trợ trong phiên bản 9.1 trở lên. Rõ ràng GRANT s là bắt buộc cho mỗi bảng trong các phiên bản cũ hơn hoặc khi quyền được đặt sau khi tạo bảng.

Các phiên bản mới hơn, như bạn đã lưu ý, có cơ sở cho nhiều khoản trợ cấp qua GRANT ... ALL TABLES, nhưng câu hỏi của bạn cụ thể là 8.4.

1

Tôi tin rằng bạn không thể làm điều đó. Nhưng bạn có thể sử dụng lược đồ thông tin để tạo các khoản tài trợ, do đó bạn không phải tự làm điều đó cho 10.000 bảng. Xem liên kết dưới đây để biết ví dụ tương đối và trang web được liên kết đến dễ dàng rất tốt để biết thông tin.

http://www.postgresonline.com/journal/archives/30-DML-to-generate-DDL-and-DCL-Making-structural-and-Permission-changes-to-multiple-tables.html

0

Thêm tất cả đặc quyền trên tất cả các bảng:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO [username]; 
+2

sẽ không hoạt động đối với Postgres <9 –

1

Nếu bạn có một người dùng có đặc quyền DML, nó hoạt động trong postgresql 8.x/9.x:

grant <userWithDMLPrivileges> to testuser; 

Hy vọng điều đó sẽ hữu ích.

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