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

GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

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

ERROR: permission denied for relation mytable
SQL state: 42501

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

내가 뭘 잘못 했어?



답변

다음은 최근 업데이트 된 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/ 에게 감사드립니다.

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


답변

추가하려고

GRANT USAGE ON SCHEMA public to readonly;

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


답변

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

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

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

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

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

‘CURRENT ROLENAME’에 ‘ROLE_OWNER’부여;

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


답변

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

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


답변

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

GRANT ALL ON TABLE mytable TO myuser;

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

GRANT ALL ON TABLE tbm_grupo TO myuser;


답변