Quyền bị từ chối cho quan hệ


329

Tôi đã cố chạy lệnh sql đơn giản:

select * from site_adzone;

và tôi đã nhận được lỗi này

ERROR:  permission denied for relation site_adzone

Vấn đề ở đây là gì?

Tôi cũng đã cố gắng chọn cho các bảng khác và gặp vấn đề tương tự. Tôi cũng đã cố gắng để làm điều này:

GRANT ALL PRIVILEGES ON DATABASE jerry to tom;

nhưng tôi đã nhận được phản hồi này từ bàn điều khiển

WARNING:  no privileges were granted for "jerry"

Bạn có một số ý tưởng những gì có thể sai?


Tôi không chắc chắn cách cập nhật quyền để tôi có thể đọc / ghi trong DB
Boban


2
Chào mừng đến với SO! Đối với câu hỏi này, bạn có thể nhận thêm trợ giúp tại dba.stackexchange.com, mặc dù bạn có thể tìm thấy nhiều bình luận như vậy :)
Jared Beck

10
Xin lỗi. Đây là câu hỏi postgresql thứ hai liên quan đến lập trình mà tôi thấy đóng cửa ngoài chủ đề tối nay! Người cuối cùng có 67.000 lượt xem, đây là 30.000 lượt xem. Chúng ta nên có một điều khoản phổ biến: Bất kỳ câu hỏi không chủ quan nào với> 15.000 lượt xem = về chủ đề.
Theodore R. Smith

1
Câu hỏi này không lạc đề! Tuy nhiên, đây là bản sao của stackoverflow.com/questions/13497352/ory
Wheaties 17/2/2015

Câu trả lời:


391

GRANT trên cơ sở dữ liệu không phải là những gì bạn cần. Cấp trên bàn trực tiếp.

Cấp đặc quyền trên cơ sở dữ liệu chủ yếu được sử dụng để cấp hoặc thu hồi các đặc quyền kết nối. Điều này cho phép bạn chỉ định ai có thể thực hiện công cụ trong cơ sở dữ liệu nếu họ có đủ quyền khác.

Bạn muốn thay thế:

 GRANT ALL PRIVILEGES ON TABLE side_adzone TO jerry;

Điều này sẽ quan tâm đến vấn đề này.


7
chạy nó như một siêu người dùng, như postgres.
Chris Travers

19
Đây có thể là phím tắt nào đó? CẤP TẤT CẢ CÁC ƯU ĐÃI TRÊN TẤT CẢ CÁC BẢNG?
Shadur

196
@Shadur CẤP TẤT CẢ CÁC ƯU ĐÃI TRÊN TẤT CẢ CÁC BẢNG TRONG SCHema công khai ĐẾN jerry;
Ron E

10
@RonE có bị giới hạn trong cơ sở dữ liệu hiện tại không?
Shadur

7
@zmiftah cho lược đồ bạn cần> CẤP TẤT CẢ CÁC ƯU ĐÃI TRÊN tên SCHemaSchema cho người dùng;
Pierozi

241

Đăng câu trả lời của Ron E để nhận các đặc quyền cấp trên tất cả các bảng vì nó có thể hữu ích cho những người khác.

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry;

21
Bạn cũng có thể cần phải thực thi một lệnh tương tự cho ALL SEQUENCESALL FUNCTIONS.
Pistos

7
Chỉ dành cho những người thắc mắc: ALL TABLEScũng bao gồm các chế độ xem, vì vậy không có ALL VIEWSlệnh riêng biệt :-)
André Gasser

74

Kết nối với cơ sở dữ liệu bên phải trước , sau đó chạy:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry;

4
cảm ơn việc kết nối với cơ sở dữ liệu phù hợp KHÔNG phải là tôi đã làm trước đó!
vào

15
kết nối với cơ sở dữ liệu bên phải tạo nên sự khó khăn lớn :)\connect databasename;
Denis Matafonov

3
ĐIỀU NÀY. Tôi đã được kết nối với "postgres" tất cả cùng. Cảm ơn bạn!
Andrew G.

2
Có kết nối với DB đã tạo ra sự khác biệt
inostia

44
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public to jerry;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public to jerry;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public to jerry;

anwser này đã cứu ngày của tôi!
anhtran

19

Bước đầu tiên và quan trọng là kết nối với db của bạn:

psql -d yourDBName

2 bước, cấp đặc quyền

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO userName;

18

Để cấp quyền cho tất cả các bảng hiện có trong lược đồ, hãy sử dụng:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema> TO <role>

Để chỉ định các quyền mặc định sẽ được áp dụng cho các bảng trong tương lai, hãy sử dụng:

ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> 
  GRANT <privileges> ON TABLES TO <role>;

ví dụ

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
  GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO admin;

Nếu bạn sử dụng SERIALhoặc BIGSERIALcột thì có thể bạn sẽ muốn làm tương tự SEQUENCES, nếu không thì bạn INSERTsẽ thất bại ( Postgres 10IDENTITY không gặp phải vấn đề đó và được đề xuất qua các SERIALloại), tức là

ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> GRANT ALL ON SEQUENCES TO <role>;

Xem thêm câu trả lời của tôi về Quyền của PostgreSQL cho Ứng dụng Web để biết thêm chi tiết và tập lệnh có thể sử dụng lại.

Tham chiếu:

BAN CHO

THAY ĐỔI RIÊNG TƯ


9

Điều này thường xảy ra khi bạn tạo một bảng dưới dạng postgres của người dùng và sau đó cố gắng truy cập nó như một người dùng thông thường. Trong trường hợp này, tốt nhất là đăng nhập với tư cách là người dùng postgres và thay đổi quyền sở hữu của bảng bằng lệnh:

alter table <TABLE> owner to <USER>;

5

Hãy chắc chắn rằng bạn đăng nhập vào psql với tư cách là chủ sở hữu của các bảng. để tìm ra ai sở hữu các bảng sử dụng\dt

psql -h CONNECTION_STRING DBNAME -U OWNER_OF_THE_TABLES

sau đó bạn có thể chạy GRANTS


0

Vì bạn đang tìm kiếm quyền chọn, tôi sẽ đề nghị bạn chỉ cấp quyền chọn chứ không phải tất cả các đặc quyền. Bạn có thể làm điều này bằng cách:

GRANT SELECT ON <table> TO <role>;

0

Bạn nên:

  1. kết nối với cơ sở dữ liệu bằng DBeaver với người dùng postgres
  2. trên tab bên trái mở cơ sở dữ liệu của bạn
  3. mở tab Vai trò / thả xuống
  4. chọn người dùng của bạn
  5. trên tab bên phải, nhấn 'Tab quyền'
  6. nhấn tab lược đồ của bạn
  7. nhấn bảng tab / thả xuống
  8. chọn tất cả các bảng
  9. chọn tất cả các hộp kiểm quyền cần thiết (hoặc nhấn Grant All)
  10. nhấn Save

-3

Tôi đã phải đối mặt với vấn đề này một lần. chỉ cần thay đổi người dùng cơ sở dữ liệu thành một siêu người dùng và vấn đề của bạn đã được giải quyết.

THAY ĐỔI myuser VỚI SUPERUSER;


Bằng cách này, bạn đang cấp nhiều tiền hơn bạn cần. Superuser sẽ cấp cho họ quyền đối với các hoạt động khác mà bạn có thể không muốn người dùng đó thực hiện, chẳng hạn như tạo người dùng khác, cơ sở dữ liệu, v.v.
Santi
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.