이에 대한 적절한 가이드, 튜토리얼 또는 비디오 시리즈는 어디에서 찾을 수 있습니까?
매뉴얼에서 모든 것을 찾을 수 있습니다. 아래 링크.
물론, 그 문제는 사소하지 않고 때로는 혼란 스럽습니다. 유스 케이스의 레시피는 다음과 같습니다.
레시피
hostdb_admin
테이블 만 생성 (삭제 및 변경) 할 수 있도록 구성하고 싶습니다 .
는 hostdb_mgr
, 읽기, 업데이트를 삽입하고 기본적으로 모든 테이블에서 삭제할 수 있습니다;
그리고 hostdb_usr
모든 테이블 (및 뷰) 만 읽을 수 있습니다.
수퍼 유저로서 postgres
:
CREATE USER schma_admin WITH PASSWORD 'youwish';
-- CREATE USER schma_admin WITH PASSWORD 'youwish' CREATEDB CREATEROLE; -- see below
CREATE USER schma_mgr WITH PASSWORD 'youwish2';
CREATE USER schma_usr WITH PASSWORD 'youwish3';
당신은 또한 데이터베이스와 역할을 관리 할 수있는보다 강력한 관리를하려면 추가 역할 특성 CREATEDB
및CREATEROLE
위.
각 역할을 다음 상위 레벨에 부여하여 모든 레벨이 최소한 다음 하위 레벨 (계단식)의 권한 세트를 "상속"합니다.
GRANT schma_usr TO schma_mgr;
GRANT schma_mgr TO schma_admin;
CREATE DATABASE hostdb;
REVOKE ALL ON DATABASE hostdb FROM public; -- see notes below!
GRANT CONNECT ON DATABASE hostdb TO schma_usr; -- others inherit
\connect hostdb -- psql syntax
나는 스키마의 이름을 지정하고 있습니다 (혼동 schma
하지 않을 hostdb
것입니다). 아무 이름이나 선택하십시오. 선택적으로schma_admin
스키마의 소유자를 만드 십시오.
CREATE SCHEMA schma AUTHORIZATION schma_admin;
SET search_path = schma; -- see notes
ALTER ROLE schma_admin IN DATABASE hostdb SET search_path = schma; -- not inherited
ALTER ROLE schma_mgr IN DATABASE hostdb SET search_path = schma;
ALTER ROLE schma_usr IN DATABASE hostdb SET search_path = schma;
GRANT USAGE ON SCHEMA schma TO schma_usr;
GRANT CREATE ON SCHEMA schma TO schma_admin;
ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT SELECT ON TABLES TO schma_usr; -- only read
ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT INSERT, UPDATE, DELETE, TRUNCATE ON TABLES TO schma_mgr; -- + write, TRUNCATE optional
ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT USAGE, SELECT, UPDATE ON SEQUENCES TO schma_mgr; -- SELECT, UPDATE are optional
내용은 and drop and alter
아래의 정보를 참조하십시오.
일이 발전함에 따라 TRIGGERS
, 저장 프로 시저 VIEWS
및 기타 객체 에 대해 비슷한 제한 사항을 적용하는 데 대한 질문도 있습니다 .
보기는 특별하다. 하나 :
... (그러나 ALL TABLES
뷰와 외부 테이블을 포함 하는 것으로 간주됩니다).
그리고 업데이트 가능한 뷰 :
보기에서 삽입, 업데이트 또는 삭제를 수행하는 사용자에게는보기에 대한 해당 삽입, 업데이트 또는 삭제 권한이 있어야합니다. 또한 뷰의 소유자는 기본 관계에 대한 관련 권한을 가져야하지만 업데이트를 수행하는 사용자는 기본 관계에 대한 권한이 필요하지 않습니다 ( 38.5 절 참조
).
방아쇠도 특별합니다. TRIGGER
테이블에 대한 권한 이 필요합니다 .
그러나 우리는 이미이 질문의 범위를 과도하게 확장하고 있습니다 ...
중요 사항
소유권
schma_admin
(단독) 테이블 삭제 및 변경 을 허용 하려면 역할이 모든 오브젝트를 소유 하게하십시오 . 설명서 :
어떤 식 으로든 객체를 떨어 뜨리거나 정의를 변경할 수있는 권리는 허용 가능한 특권으로 취급되지 않습니다. 소유자에 내재되어 있으며 부여하거나 취소 할 수 없습니다. 그러나 개체를 소유 한 역할의 멤버 자격을 부여하거나 취소하면 비슷한 효과를 얻을 수 있습니다 (아래 참조). 소유자는 개체에 대한 모든 부여 옵션도 암시 적으로 제공합니다.
ALTER TABLE some_tbl OWNER TO schma_admin;
또는 역할schma_admin
을가진 모든 객체를 생성하여 소유자를 명시 적으로 설정할 필요는 없습니다. 또한 기본 권한을 단순화하므로 한 역할에 대해서만 설정하면됩니다.
기존 객체
기본 권한은 새로 생성 된 개체 및 해당 개체가 생성 된 특정 역할에만 적용됩니다. 기존 객체에 대한 권한도 조정하려고합니다 .
DEFAULT PRIVILEGES
수퍼 유저처럼 설정 되지 않은 역할을 가진 객체를 생성하는 경우에도 마찬가지 postgres
입니다. 소유권을 다시 할당 schma_admin
하고 수동으로 권한을 설정할 - 또는 설정 DEFAULT PRIVILEGES
을위한 postgres
뿐만 아니라 : (오른쪽 DB에 연결되어있는 동안!)
ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT ... -- etc.
기본 권한
ALTER DEFAULT PRIVILEGES
명령 의 중요한 부분이 누락되었습니다 . 달리 지정하지 않는 한 현재 역할에 적용됩니다.
기본 권한은 현재 데이터베이스에만 적용됩니다. 따라서 DB 클러스터의 다른 데이터베이스를 망칠 필요가 없습니다. 설명서 :
현재 데이터베이스에서 생성 된 모든 개체
당신은 할 수 있습니다 또한 대한 기본 권한을 설정할 FUNCTIONS
와 TYPES
(단지 TABLES
와 SEQUENCES
)하지만, 그 필요되지 않을 수 있습니다.
에 대한 기본 권한 PUBLIC
부여 된 기본 권한 PUBLIC
은 일부에 의해 기초적이고 과대 평가됩니다. 설명서 :
PostgreSQL은 일부 객체 유형에 대한 기본 권한을에 부여합니다
PUBLIC
. 테이블, 열, 스키마 또는 테이블 스페이스에는 기본적으로 권한이 부여되지 않습니다 PUBLIC
. 다른 유형의 기본 권한 부여 PUBLIC
다음과 같습니다 CONNECT
및 CREATE TEMP TABLE
데이터베이스에 대한; EXECUTE
기능에 대한 특권; 및 USAGE
언어에 대한 권한.
대담한 강조 광산. 일반적으로 위의 명령 하나만으로 충분합니다.
REVOKE ALL ON DATABASE hostdb FROM public;
특히 PUBLIC
새 스키마 에는 기본 권한이 부여되지 않습니다 . "public"이라는 기본 스키마가에 ALL
대한 권한으로 시작하는 것이 혼동 될 수 있습니다 PUBLIC
. 새로 작성된 데이터베이스로 쉽게 시작할 수있는 편리한 기능입니다. 어떤 식 으로든 다른 스키마에는 영향을 미치지 않습니다. 당신은 할 수 템플릿 데이터베이스에서 이러한 권한을 취소 template1
한 후이 클러스터의 모든 새로 만든 데이터베이스가 그들없이 시작 :
\connect template1
REVOKE ALL ON SCHEMA public FROM public;
특권 TEMP
우리가 모든 권한을 취소 이후 hostdb
부터 PUBLIC
우리가 명시 적으로 허용하지 않는 한, 일반 사용자는 임시 테이블을 만들 수 없습니다. 이것을 추가하거나 원하지 않을 수 있습니다.
GRANT TEMP ON DATABASE hostdb TO schma_mgr;
search_path
를 설정하는 것을 잊지 마십시오 search_path
. 클러스터에 데이터베이스가 하나만 있으면에서 전역 기본값을 설정할 수 있습니다 postgresql.conf
. 그렇지 않은 경우 데이터베이스의 속성으로 설정하거나 관련 역할 또는 둘의 조합으로 설정하십시오. 세부:
당신은 그것을 설정할 수 있습니다 schma, public
당신은뿐만 아니라, 심지어 (덜) 공개 스키마를 사용하는 경우 $user, schma, public
...
다른 방법은 기본 스키마 "public"을 사용하는 것이며, search_path
변경하지 않는 한 기본 설정과 함께 작동해야 합니다. PUBLIC
이 경우에 대한 권한을 취소해야합니다 .
관련
public
pseudorole에 있다고 생각합니다 . 다른 모든 역할 (사용자, 그룹-모두 동일)이 구성원 인 역할로 생각할 수 있습니다. 예를 들어 다음과 같은 방법으로 권한을 제거하십시오REVOKE CREATE ON SCHEMA hostdb FROM public
. 데이터베이스 수준에 대한 권한을 취소하면 일부 데이터베이스 수준 권한 만 비활성화되며 스키마 나 테이블에는 영향을 미치지 않습니다.