[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;