LRI: quyền bị từ chối cho chuỗi thành phố_id_seq bằng Postgres


201

Tôi mới ở postgres (và tại tất cả các hệ thống thông tin cơ sở dữ liệu). Tôi đã chạy theo kịch bản sql trên cơ sở dữ liệu của mình:

create table cities (
id serial primary key,
name text not null
);

create table reports (
id serial primary key,
cityid integer not null references cities(id),
reportdate date not null,
reporttext text not null
);

create user www with password 'www';

grant select on cities to www;
grant insert on cities to www;
grant delete on cities to www;

grant select on reports to www;
grant insert on reports to www;
grant delete on reports to www;

grant select on cities_id_seq to www;
grant insert on cities_id_seq to www;
grant delete on cities_id_seq to www;

grant select on reports_id_seq to www;
grant insert on reports_id_seq to www;
grant delete on reports_id_seq to www;

Khi, như người dùng www, cố gắng:

insert into cities (name) values ('London');

Tôi nhận được lỗi sau đây:

ERROR: permission denied for sequence cities_id_seq

Tôi hiểu rằng vấn đề nằm ở loại nối tiếp. Đó là lý do tại sao tôi cấp quyền chọn, chèn và xóa cho * _id_seq cho www. Tuy nhiên, điều này không khắc phục vấn đề của tôi. Tôi đang thiếu gì?


2
Cấp chèn / xóa trên một chuỗi không có ý nghĩa với tôi. Tôi ngạc nhiên rằng nó thậm chí hoạt động.
a_horse_with_no_name 17/212

Câu trả lời:


359

Kể từ PostgreSQL 8.2, bạn phải sử dụng:

GRANT USAGE, SELECT ON SEQUENCE cities_id_seq TO www;

SỬ DỤNG GRANT - Đối với các chuỗi, đặc quyền này cho phép sử dụng các hàm dòng và giá trị tiếp theo.

Cũng như được chỉ ra bởi @epic_fil trong các nhận xét, bạn có thể cấp quyền cho tất cả các chuỗi trong lược đồ với:

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO www;

52
FYI, cú pháp ".. TRÊN TẤT CẢ CÁC YÊU CẦU TRONG lược đồ SCHema" cũng được hỗ trợ.
epic_fil

5
Hấp dẫn. Tôi đã thực hiện một GRANT tất cả trên bàn rằng trình tự của tôi nằm trong, nhưng điều này dường như không bao gồm trình tự. Điều này dường như cũng rất bởi hệ điều hành.
Kinnard Hockenhull

41
Làm thế nào đây là một điều thực sự? Khi nào tôi muốn cho phép người dùng chèn dữ liệu vào bảng nhưng KHÔNG muốn cho phép họ sử dụng thực tế là một trong các cột đang tự động tăng?
Brett Widmeier

5
SELECTcần thiết không? Không nên USAGEbao gồm những gì cần thiết?
Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ

6
@BrettWidmeier Chính xác. Điều đó làm tôi kinh ngạc khi các nhà phát triển chấp nhận điều này. Giống như mọi người muốn đi lang thang trên Internet và đọc các luồng StackOverflow không đáy trong nỗ lực khắc phục những thứ đáng lẽ phải hoạt động ngay lập tức.
milosmns

67

Vì @Phil có một nhận xét nhận được rất nhiều upvote có thể không được chú ý, tôi đang sử dụng cú pháp của anh ấy để thêm câu trả lời sẽ cấp quyền cho người dùng cho tất cả các chuỗi trong lược đồ (giả sử lược đồ của bạn là mặc định 'công khai' )

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public to www;

2
Lưu ý rằng điều này chỉ hoạt động trong PostgreQuery 9.0 trở lên, để thực hiện tương tự trong 8 bạn có thể làm một cái gì đó như: CHỌN 'SỬ DỤNG GRANT, CHỌN TRÊN' || quote_ident (schemaname) || '.' | | quote_ident (tên hiệu) | | 'ĐẾN www;' TỪ pg_statio_all_ resultences WHERE schemaname = 'công khai'; - Tom Gerken 2 ngày trước
Tom Gerken

39

@Tom_Gerken, @epic_fil và @kupson hoàn toàn chính xác với các tuyên bố của họ để cấp quyền làm việc với các chuỗi hiện có. Tuy nhiên, người dùng sẽ KHÔNG có quyền truy cập vào các chuỗi được tạo trong tương lai. Để làm điều đó, bạn phải kết hợp câu lệnh GRANT với câu lệnh ALTER DEFAULT PRIVILEGES, như vậy:

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO www;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT USAGE, SELECT ON SEQUENCES TO www;

Điều này chỉ hoạt động trên PostgreSQL 9+, tất nhiên.

Điều này sẽ nối với các đặc quyền mặc định hiện có, không ghi đè lên chúng, vì vậy khá an toàn trong vấn đề đó.


-2

Thực hiện lệnh sau trong postgres.

đăng nhập vào postgres:

sudo su postgres;

tên người dùng psql;

CREATE SEQUENCE public.cities_id_seq ĐỘTĂNG 1
MINVALUE 0
MAXVALUE 1
BẮT ĐẦU 1 CACHE 1; ALTER TABLE public.cities_id_seq CHỦ SỞ HỮU cho pgowner;

pgowner sẽ là người dùng cơ sở dữ liệu của bạn.

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.