오류 : 읽기 전용 사용자로 SELECT를 시도하는 동안 Postgres의 관계 테이블 이름에 대한 권한이 거부되었습니다.


89
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

읽기 전용 사용자는 연결할 수 있으며 테이블을 볼 수 있지만 간단한 선택을 시도하면 다음을 얻습니다.

ERROR: permission denied for relation mytable
SQL state: 42501

이것은 PostgreSQL 9.1에서 발생합니다.

내가 뭘 잘못 했어?


1
"relation mytable"에 대한 세부 정보를 제공 할 수 있습니까? 스키마, 그것은 "진짜"테이블 (또는 뷰 / 기능), 트리거입니다 ...
이고르 Romanchenko

답변:


162

다음은 최근 업데이트 된 PostgreSQL 9+를위한 완전한 솔루션입니다.

CREATE USER readonly  WITH ENCRYPTED PASSWORD 'readonly';
GRANT USAGE ON SCHEMA public to readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;

-- repeat code below for each database:

GRANT CONNECT ON DATABASE foo to readonly;
\c foo
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly; --- this grants privileges on new tables generated in new database "foo"
GRANT USAGE ON SCHEMA public to readonly; 
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

몇 가지 중요한 측면에 대해 https://jamie.curle.io/creating-a-read-only-user-in-postgres/ 에게 감사드립니다.

누구든지 더 짧은 코드를 찾으면 기존의 모든 데이터베이스에 대해이 작업을 수행 할 수있는 코드가 더 좋습니다.


6
여기에 조회수가 포함 되나요?
프랭크 Conry

9
GRANT ALL기본적으로 읽기 전용 사용자 에게 권한 을 부여하는 이유는 무엇 입니까?
Slava Fomin II

1
그것은 여전히 샘 오류 정의되어 내가 정확히 준
아니시 피나

을 사용하여 부여 된 권한을 확인할 수 있습니다 \ddp. 읽기 전용 액세스 =r/와 같이 표시되어야 granting_user=r/readonly_user합니다.
Greg Bray

이것은 질문의 말 그대로 SQL입니다. 나는 그것이 어떻게 해결책을 제공하는지 보지 못합니다.
r351574nc3

12

추가하려고

GRANT USAGE ON SCHEMA public to readonly;

스키마에서 개체를 사용하려면 스키마에 대한 필수 권한이 ​​있어야한다는 사실을 몰랐을 것입니다.


뭔가 이상한 일이 일어나고, 내가 사용하여 서버에서이 명령을 실행 psql으로 postgres, 사용자가 나는 적절한 응답을받을 수 있나요 GRANT. 그래도 테이블의 ACL을 살펴보면 두 개의 다른 계정 만 표시됩니다. 하나는 데이터베이스 소유자 jirauser이고 다른 하나는 라는 읽기 전용 계정 qauser입니다. 그러나 나는 readonly거기에 나타나지 않습니다. Postgres는 버전 9.1이고 서버를 다시 시작했지만 여전히 아무 일도 일어나지 않습니다.
sorin

2
psql 콘솔에서 \ du의 출력은 무엇입니까? 이 출력을 계속 제공 할 수 있습니까? 아니면 답변과 같이 이미 수정되어 있습니까?
sufleR

출력이 정확했기 때문에 무슨 일이 일어 났는지 잘 모르겠습니다 (GRANT). YEsterday는 작동하지 않았지만 오늘은 다시 세 명령을 모두 실행 한 후에 작동했습니다.
sorin

3
참고 : 이에 대한 예상 respose는 단순히 'GRANT'입니다. '경고 : "공개"에 대한 권한이 부여되지 않았습니다'가 표시되면 작동하지 않은 것입니다. 사용자 읽기 전용은 자신에게 추가 권한을 부여 할 수 없습니다. 'GRANT'권한이있는 사용자 만이를 수행 할 수 있으므로 수퍼 유저로 로그인해야합니다.
PeterVermont

안녕하세요, postgres에 SCHEMA public의 모든 테이블에 SELECT를 부여하려고 할 때; 다음과 같이 응답합니다. 오류 : 관계 databasechangeloglock에 대한 권한이 거부되었습니다. 내가 뭘 잘못하고 있는지 알아? 감사합니다 (공개 주소를 사용하고 터미널을 통해 액세스하는 GAppEngine Posgres9.6에서 발생)
Mike

-5

이것은 나를 위해 일했습니다.

다음을 사용하여 로그인 한 현재 역할을 확인하십시오. SELECT CURRENT_USER, SESSION_USER;

참고 : 스키마 소유자와 일치해야합니다.

스키마 | 이름 | 유형 | 소유자
-------- + -------- + ------- + ----------

소유자가 다른 경우 다음과 같이 관리자 역할에서 현재 사용자 역할에 모든 권한을 부여합니다.

'CURRENT ROLENAME'에 'ROLE_OWNER'부여;

그런 다음 쿼리를 실행하려고하면 이제 모든 관계에 액세스 할 수 있으므로 출력이 제공됩니다.


5
소유자를 readonly라는 사용자로 변경하는 것은 올바른 수정처럼 들리지 않습니다.
Anna

귀하의 경우에 따라 잘못된 테이블 소유자가 실제로 원인이 될 수 있습니다. PostgreSQL에서 테이블 ownershiip를 변경하는 적절한 방법 : stackoverflow.com/a/13535184
tanius dec

-6

사용자에게 역할에 대한 속성이 있는지 확인하십시오. 예를 들면 :

postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 flux      |                                                | {}
 postgres  | Superuser, Create role, Create DB, Replication | {}

다음 명령을 수행 한 후 :

postgres=# ALTER ROLE flux WITH Superuser;
ALTER ROLE
postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 flux      | Superuser                                      | {}
postgres  | Superuser, Create role, Create DB, Replication | {}

문제가 해결되었습니다.

역할 및 항목에 대한 자습서를 참조하십시오. https://www.digitalocean.com/community/tutorials/how-to-use-roles-and-manage-grant-permissions-in-postgresql-on-a-vps--2


18
아니! "선택"을 수행하기 위해 "읽기 전용"이라는 사용자에게 수퍼 유저 역할을 부여하는 것은 올바른 수정이 아닙니다.
Anna

@Anna 그건 여기서 일어나는 일이 아닙니다. 이 스레드는 읽기 전용 액세스를 제공하는 것이 아닙니다. 이 스레드는 다른 사용자에게 읽기 전용 액세스 권한을 부여하기 위해 사용자 액세스 권한을 부여하는 것입니다. IMHO, 맞습니다. 사용자가 수퍼 유저가 아닌 경우 읽기 전용 사용자를 만들 수 없습니다. 오류가 발생하는 것은 읽기 전용 사용자를 만들 수있는 것입니다ERROR: permission denied for relation mytable
r351574nc3

-7

다음 쿼리를 실행해야합니다.

GRANT ALL ON TABLE mytable TO myuser;

또는 오류가 뷰에있는 경우 테이블에 권한이 없을 수 있으므로 다음 쿼리를 실행해야합니다.

GRANT ALL ON TABLE tbm_grupo TO myuser;

5
사용자를 "읽기 전용"이라고합니다. 사용자에게 모든 권한을 부여하는 것이 목표라는 것은 의심 스럽습니다. 그는 단지 선택을하고 싶어합니다.
Anna

이것은 ALTER DROP DELETEEct를 제공하는 경우 사용자 이름을 'ReadOnly'로 지정하는 목적을 무효화합니다. 그 사용자에게 ...
JayRizzo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.