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;
답변
주어진 스키마의 모든 기존 테이블에 대한 권한을 설정하는 속기를 찾았습니다 . 설명서는 다음을 명확히합니다 .
(그러나 뷰 및 외부 테이블
ALL TABLES
을 포함 하는 것으로 간주됩니다 ).
대담하게 강조합니다. serial
열은 nextval()
열 기본값으로 시퀀스에서 구현되며 설명서를 인용합니다 .
시퀀스의 경우이 권한으로
currval
및nextval
함수를 사용할 수 있습니다.
따라서 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 ROLE
SQL 스크립트를 복사 할 때 절을 수동으로 조정해야합니다 .
답변
내 대답은 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_;
public
there 의 사용은 모든 새 데이터베이스 / 카탈로그에 대해 생성 된 기본 스키마의 이름을 나타냅니다. 스키마를 생성 한 경우 자신의 이름으로 바꿉니다.
스키마에 대한 액세스
스키마에 액세스하려면 모든 작업에 대해 사용자에게 “사용”권한이 부여되어야합니다. 사용자가 선택, 삽입, 업데이트 또는 삭제하기 전에 먼저 사용자에게 스키마에 대한 “사용”권한이 부여되어야합니다.
Postgres를 처음 사용할 때는이 요구 사항을 알 수 없습니다. 기본적으로 모든 데이터베이스에는이라는 첫 번째 스키마가 public
있습니다. 그리고 기본적으로 모든 사용자에게는 해당 특정 스키마에 대한 “사용”권한이 자동으로 부여됩니다. 추가 스키마를 추가 할 때 명시 적으로 사용 권한을 부여해야합니다.
GRANT USAGE ON SCHEMA some_schema_ TO some_user_ ;
Postgres 문서 에서 발췌 :
스키마의 경우 지정된 스키마에 포함 된 개체에 대한 액세스를 허용합니다 (개체의 고유 한 권한 요구 사항도 충족된다고 가정). 기본적으로 피부 여자는 스키마 내에서 개체를 “조회”할 수 있습니다. 이 권한이 없어도 예를 들어 시스템 테이블을 쿼리하여 개체 이름을 볼 수 있습니다. 또한이 권한을 취소 한 후 기존 백엔드에 이전에이 조회를 수행 한 명령문이있을 수 있으므로 이는 객체 액세스를 방지하는 완전히 안전한 방법이 아닙니다.
자세한 내용은 질문, GRANT USAGE ON SCHEMA가 정확히 수행하는 작업을 참조하십시오 . . Postgres 전문가 Craig Ringer 의 답변 에 특별한주의를 기울이 십시오 .
기존 개체 대 미래
이러한 명령은 기존 개체에만 영향을줍니다. 나중에 생성하는 테이블 등은 위의 행을 다시 실행할 때까지 기본 권한을 갖습니다. Erwin Brandstetter 의 다른 답변을 참조하여 기본값을 변경하여 향후 개체에 영향을 미칩니다.