DB의 특정 스키마에 대한 모든 권한을 PostgreSQL의 그룹 역할에 부여합니다.


93

PostgreSQL 9.0을 사용하여 "staff"라는 그룹 역할이 있으며 특정 스키마의 테이블에서이 역할에 모든 (또는 특정) 권한을 부여하고 싶습니다. 다음 작업 없음

GRANT ALL ON SCHEMA foo TO staff;
GRANT ALL ON DATABASE mydb TO staff;

"staff"의 구성원은 특정 테이블에 대해 모두 권한을 부여 하지 않는 한 "foo"스키마의 개별 테이블 또는 (두 번째 명령의 경우) 데이터베이스의 테이블에 대해 SELECT 또는 UPDATE 할 수 없습니다 .

나와 내 사용자의 삶을 더 쉽게 만들 수있는 방법은 무엇입니까?

업데이트 : serverfault.com에서 비슷한 질문을 통해 알아 냈습니다 .

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA foo TO staff;

답변:


125

주어진 스키마의 모든 기존 테이블에 대한 권한을 설정하는 속기를 찾았습니다 . 설명서는 다음을 명확히합니다 .

(그러나 외부 테이블ALL TABLES 을 포함 하는 것으로 간주됩니다 ).

대담하게 강조합니다. serial열은 nextval()열 기본값으로 시퀀스에서 구현되며 설명서를 인용합니다 .

시퀀스의 경우이 권한으로 currvalnextval함수를 사용할 수 있습니다.

따라서 serial열 이있는 경우 시퀀스 에 대해 부여 USAGE(또는 ALL PRIVILEGES) 할 수도 있습니다.

GRANT USAGE ON ALL SEQUENCES IN SCHEMA foo TO mygrp;

참고 : Postgres 10 이상의 ID 열 은 추가 권한이 필요하지 않은 암시 적 시퀀스를 사용합니다. ( serial열 업그레이드를 고려하십시오 .)

무엇에 대한 새로운 객체?

DEFAULT PRIVILEGES사용자 또는 스키마 에도 관심이 있습니다 .

ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT ALL PRIVILEGES ON TABLES TO staff;
ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT USAGE          ON SEQUENCES TO staff;
ALTER DEFAULT PRIVILEGES IN SCHEMA foo REVOKE ...;

이렇게하면 향후 생성되는 개체에 대한 권한이 자동으로 설정되지만 기존 개체에 대한 권한은 설정되지 않습니다.

기본 권한은 대상 사용자 ( )가 생성 한 객체 에만 적용됩니다 FOR ROLE my_creating_role. 해당 절이 생략되면 기본값은를 실행하는 현재 사용자 ALTER DEFAULT PRIVILEGES입니다. 명시 적으로 :

ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo GRANT ...;
ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo REVOKE ...;

또한 pgAdmin III의 모든 버전에는 미묘한 버그 가 있으며 현재 역할에 적용되지 않더라도 SQL 창에 기본 권한이 표시 됩니다. FOR ROLESQL 스크립트를 복사 할 때 절을 수동으로 조정해야합니다 .


2
어윈을 알기 위해 조언을 게시 한 지 10 분 후에 필요했습니다. 당신이 내가 무엇을하려고하는지 알고있는 것 같군요. 새 테이블을 만들고 그것이 올바른 권한이 없다는 것을 발견했습니다. 당신의 대답이 구출되었습니다.
punkish

5
@punkish : 프리 코그 배지를 요구합니다! 젠장, 이미 다른 용도로 사용되었습니다.
Erwin Brandstetter

실행할 때 ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT ALL PRIVILEGES ON TABLES TO staff;어떤 데이터베이스를 어떻게 압니까? SCHEMA foo다른 데이터베이스에 존재할 수 있습니까?
J86

2
@ J86 : 명령이 실행되는 현재 데이터베이스에만 적용됩니다 .
Erwin Brandstetter 2019

1
@ErwinBrandstetter 다른 전용 migration_user 가 테이블을 자동으로 생성하는 경우 (앱 시작시 플라이 웨이 마이그레이션이 실행되는 경우 ) app_user (읽기-쓰기) 에 향후 테이블 / 시퀀스에 대한 액세스 권한을 부여 할 수 있습니까 ?
lexeme

45

내 대답은 ServerFault.com의 대답과 비슷합니다 .

보수적

"모든 권한"을 부여하는 것보다 더 보수적으로하고 싶다면 이와 같은 것을 시도해 볼 수 있습니다.

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO some_user_;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO some_user_;

publicthere 의 사용은 모든 새 데이터베이스 / 카탈로그에 대해 생성 된 기본 스키마의 이름을 나타냅니다. 스키마를 생성 한 경우 자신의 이름으로 바꿉니다.

스키마에 대한 액세스

스키마에 액세스하려면 모든 작업에 대해 사용자에게 "사용"권한이 부여되어야합니다. 사용자가 선택, 삽입, 업데이트 또는 삭제하기 전에 먼저 사용자에게 스키마에 대한 "사용"권한이 부여되어야합니다.

Postgres를 처음 사용할 때는이 요구 사항을 알 수 없습니다. 기본적으로 모든 데이터베이스에는이라는 첫 번째 스키마가 public있습니다. 그리고 기본적으로 모든 사용자에게는 해당 특정 스키마에 대한 "사용"권한이 자동으로 부여됩니다. 추가 스키마를 추가 할 때 명시 적으로 사용 권한을 부여해야합니다.

GRANT USAGE ON SCHEMA some_schema_ TO some_user_ ;

Postgres 문서 에서 발췌 :

스키마의 경우 지정된 스키마에 포함 된 개체에 대한 액세스를 허용합니다 (개체의 고유 한 권한 요구 사항도 충족된다고 가정). 기본적으로 피부 여자는 스키마 내에서 개체를 "조회"할 수 있습니다. 이 권한이 없어도 예를 들어 시스템 테이블을 쿼리하여 개체 이름을 볼 수 있습니다. 또한이 권한을 취소 한 후 기존 백엔드에 이전에이 조회를 수행 한 명령문이있을 수 있으므로 이는 객체 액세스를 방지하는 완전히 안전한 방법이 아닙니다.

자세한 내용은 질문, GRANT USAGE ON SCHEMA가 정확히 수행하는 작업을 참조하십시오 . . Postgres 전문가 Craig Ringer 의 답변 에 특별한주의를 기울이 십시오 .

기존 개체 대 미래

이러한 명령은 기존 개체에만 영향을줍니다. 나중에 생성하는 테이블 등은 위의 행을 다시 실행할 때까지 기본 권한을 갖습니다. Erwin Brandstetter다른 답변을 참조하여 기본값을 변경하여 향후 개체에 영향을 미칩니다.


1
위의 두 가지 보조금 외에도 한 가지 더 보조금이 필요합니다. GRANT USAGE ON SCHEMA public TO some_user_;
Ning Liu

1
@NingLiu GRANT USAGE를 지적 해주셔서 감사합니다. 답변에 섹션을 추가했습니다.
Basil Bourque 2015 년

SCHEMA에 대한 GRANT 사용은 제가 찾고 있던 것입니다.
Basil Musa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.