오류 : Postgres를 사용하여 city_id_seq 시퀀스에 대한 권한이 거부되었습니다.


201

나는 postgres (그리고 데이터베이스 정보 시스템 모두)를 처음 사용했습니다. 내 데이터베이스에서 다음 SQL 스크립트를 실행했습니다.

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;

사용자 www로서 다음을 시도 할 때 :

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

다음과 같은 오류가 발생합니다.

ERROR: permission denied for sequence cities_id_seq

직렬 유형에 문제가 있음을 알았습니다. 그래서 * _id_seq에 대한 선택, 삽입 및 삭제 권한을 www에 부여합니다. 그러나 이것은 내 문제를 해결하지 못합니다. 내가 무엇을 놓치고 있습니까?


2
시퀀스에 삽입 / 삭제를 부여하는 것은 의미가 없습니다. 나는 그것이 심지어 작동한다는 것에 놀랐다.
a_horse_with_no_name

답변:


359

PostgreSQL 8.2부터 다음을 사용해야합니다.

GRANT USAGE, SELECT ON SEQUENCE cities_id_seq TO www;

GRANT 사용-시퀀스의 경우이 권한으로 currval 및 nextval 함수를 사용할 수 있습니다.

주석에서 @epic_fil이 지적한 것처럼 다음을 사용하여 스키마의 모든 시퀀스에 권한을 부여 할 수 있습니다.

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

52
참고로, "SCHEMA schema_name의 모든 시퀀스에서 ON."구문도 지원됩니다.
epic_fil

5
흥미 롭군 내 시퀀스가있는 테이블에서 GRANT를 모두 수행했지만 시퀀스를 다루지 않는 것 같습니다. 이것은 또한 OS에 의한 것 같습니다.
Kinnard Hockenhull 2016 년

41
이게 진짜 어때? 사용자가 테이블에 데이터를 삽입 할 수있게하고 싶지만 열 중 하나가 자동 증가한다는 사실을 사용하고 싶지는 않습니까?
Brett Widmeier

5
IS SELECT필요? USAGE필요한 것을 다루지 않아야 합니까?
Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ

6
@BrettWidmeier 정확합니다. 개발자들이 이런 종류의 일을 어떻게 견뎌 낼 수 있는지는 저에게 불쾌감을줍니다. 사람들이 인터넷에서 로밍하고 밑바닥이없는 StackOverflow 스레드를 읽고 즉시 작동 해야하는 것을 수정하려고하는 것과 같습니다.
milosmns

67

@Phil은 눈에 띄지 않을만한 많은 공감을 얻는 의견을 가지고 있기 때문에 그의 구문을 사용하여 스키마의 모든 시퀀스에 대해 사용자에게 권한을 부여하는 답변을 추가하고 있습니다 (스키마가 기본 '공개'라고 가정) )

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

2
이것은 PostgreSQL 9.0 이상에서만 작동하며 8에서 동일하게 수행하려면 SELECT 'GRANT USAGE, SELECT ON'|| quote_ident (스키마 이름) || '.' || quote_ident (상호명) || 'www로 이동' pg_statio_all_sequences에서 schemaname = 'public'; – Tom Gerken 2 일 전
Tom Gerken

39

@Tom_Gerken, @epic_fil 및 @kupson은 기존 시퀀스로 작업 할 수있는 권한을 부여하기 위해 명령문에 매우 정확합니다. 그러나 사용자는 나중에 생성 된 시퀀스에 액세스 할 수 없습니다. 이를 위해서는 GRANT 문을 ALTER DEFAULT PRIVILEGES 문과 결합해야합니다.

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

물론 이것은 PostgreSQL 9+에서만 작동합니다.

기존의 기본 권한을 덮어 쓰지 않고 추가 할 수 있으므로 매우 안전합니다.


-2

postgres에서 다음 명령을 실행하십시오.

postgres에 로그인 :

sudo su postgres;

psql dbname;

시퀀스 생성 public.cities_id_seq 증가 1 최소값
0 최대 값
1
시작 1 캐시 1; ALTER TABLE public.cities_id_seq 소유자에게 소유권;

pgowner가 데이터베이스 사용자가됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.