Quyền bị từ chối cho quan hệ <bảng>


12

Tôi đã chạy SQL sau trong psql:

CREATE USER bspu LOGIN;

CREATE DATABASE bsp OWNER bspu;

GRANT ALL PRIVILEGES ON DATABASE bsp TO bspu;

\c bsp

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  client_id VARCHAR(20) NOT NULL,
  api_key VARCHAR(100) NOT NULL,
  api_secret VARCHAR(100) NOT NULL,
  auth_token VARCHAR(128) NOT NULL
);

Khi tôi đăng nhập với tư cách bspuvà thử truy vấn usersbảng, tôi gặp lỗi:

permission denied for relation users

Tôi đã thử chạy:

ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO bspu;

Nhưng nó không giúp được gì. Tôi đang làm gì sai? Tại sao chủ sở hữu cơ sở dữ liệu KHÔNG có quyền truy vấn cơ sở dữ liệu của chính nó?

EDIT: Bây giờ tôi đã nâng cấp bspulên superuser, vì vậy tôi có thể tiếp tục làm việc. Bất kỳ hướng dẫn thêm đánh giá cao.


Sản lượng của \dt "users"chương trình là gì?
bma

@bma chỉ acc chính của tôi được liệt kê.
nếu __name__ là Không có

Bạn đã chạy các lệnh ban đầu như những gì người dùng? Bạn nhận được gì từ SELECT session_user, current_userđầu kịch bản của bạn? Và phiên bản Postgres của bạn là gì?
Erwin Brandstetter

Nếu đây là các lệnh chính xác mà bạn chạy, thì bạn vẫn được kết nối với 'acc chính' của mình. Vì vậy, nó đi xuống những đặc quyền bạn có. Nếu không, hãy xem câu trả lời tuyệt vời của Erwin. (Hãy để tôi thừa nhận rằng tôi cảm thấy thật ngu ngốc khi thông báo lỗi này không cho biết vai trò nào không được phép. Ví dụ: khi một người chạy một chuỗi chức năng với AN NINH DEFINER, nó khá nhanh bị nhầm lẫn là ai.)
dezso

Câu trả lời:


22

DEFAULT PRIVILEGESlàm không thay đổi quyền cho hiện vật. Chúng là các đặc quyền mặc định cho các đối tượng mới được tạo và chỉ cho vai trò cụ thể mà chúng thuộc về. Nếu bạn không xác định vai trò khi chạy ALTER DEFAULT PRIVILEGES, nó sẽ mặc định là vai trò hiện tại (khi thực hiện ALTER DEFAULT PRIVILEGEScâu lệnh.

Ngoài ra, vì bạn đang sử dụng một serialcột tạo ra một cột SEQUENCE, bạn cũng sẽ muốn đặt các đặc quyền mặc định cho các chuỗi.

Chạy cái này trên người dùng mà bạn tạo đối tượng, trước khi bạn chạy CREATElệnh:

ALTER DEFAULT PRIVILEGES [ FOR ROLE my_create_role] GRANT ALL ON TABLES TO bspu;
ALTER DEFAULT PRIVILEGES [ FOR ROLE my_create_role] GRANT ALL ON SEQUENCES TO bspu;

Nếu bạn nên sử dụng pgAdmin, một lời cảnh báo. Có một lỗi trong phiên bản hiện tại 1.20 (hoặc cũ hơn) trong màn hình của tập lệnh SQL được thiết kế ngược cho DEFAULT PRIVILEGES. Màn hình bỏ qua người dùng sở hữu và do đó không chính xác trong một số trường hợp. Tôi đã báo cáo lỗi, vấn đề đang chờ xử lý .

Đối với các đối tượng hiện có, bạn cũng có thể quan tâm đến hình thức "lô" này của GRANTlệnh :

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO bspu;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO bspu;

Nhiều hơn theo câu hỏi liên quan này trên SO:


1
Lỗi được đề cập vẫn còn tồn tại trong pgAdmin4, xem redmine.postgresql.org/issues/4685 , đã được gắn cờ là bản sao của redmine.postgresql.org/issues/4256
dpprdan

-1
This is working for me after some research. psql (9.6.12)

-- login to postgres database server as postgres user.
ssh <user>>@hostname.<domain>>.com
sudo su postgres
id
psql
postgres=# create user sentry_read with login password 'sentry_read';
postgres=# du+
postgres=# \l+
-- **very important: make sure we should connect required database before we grant to user.**
postgres=# \c sentry
postgres=# \dt
sentry=# \dp SENTRY_VERSION
sentry=# select * from "SENTRY_VERSION";
sentry=# GRANT SELECT ON ALL TABLES IN SCHEMA public TO sentry_read;
postgres=# \q

[user@hostname ~]$ psql -U sentry_read -d sentry -h hostname.<domain>>.com -W
sentry=> select * from "SENTRY_VERSION";
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.