먼저 쿼리를 실행하려면 데이터베이스에 연결할 수 있어야합니다. 이것은 달성 할 수 있습니다
REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;
GRANT CONNECT
ON DATABASE database_name
TO user_name;
이 REVOKE
필요 하기 때문에
키워드 PUBLIC은 나중에 작성 될 수있는 역할을 포함하여 모든 역할에 권한이 부여됨을 나타냅니다. PUBLIC은 항상 모든 역할을 포함하는 암시 적으로 정의 된 그룹으로 생각할 수 있습니다. 특정 역할에는 직접 부여 된 권한, 현재 구성원 인 역할에 부여 된 권한 및 PUBLIC에 부여 된 권한의 합계가 있습니다.
사용자를 DML 문으로 제한하려면 조금 더해야 할 일이 있습니다.
REVOKE ALL
ON ALL TABLES IN SCHEMA public
FROM PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE
ON ALL TABLES IN SCHEMA public
TO user_name;
여기에는 스키마가 하나만 있다고 가정합니다 (기본적으로 이름은 'public'입니다).
Jack Douglas가 지적했듯이 위의 내용은 이미 존재하는 테이블에 대한 권한 만 제공합니다 . 향후 테이블에 대해서도 동일하게하려면 기본 권한 을 정의 해야합니다 .
ALTER DEFAULT PRIVILEGES
FOR ROLE some_role -- Alternatively "FOR USER"
IN SCHEMA public
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO user_name;
여기, some_role
테이블을 만드는 역할 user_name
이 있고 권한을 얻는 사람이 있습니다. 이를 정의하려면 로그인 some_role
하거나 회원 으로 로그인 해야합니다.
그리고 마지막으로 시퀀스에 대해 동일한 작업을 수행해야합니다 (PlainFan이 지적 해 주셔서 감사합니다). 여기에 USAGE
필요한 특권이 있습니다.
FOR some_role
나중에 만든 테이블에서 작동하게하기 위해 누락 된 핵심 부분이었습니다. 그러나로 로그인 할 필요가 없었습니다 .some_role
기본 관리자로 쿼리를 실행 한 경우에도 작동했습니다postgres
.