사용자의 모든 테이블에 대한 액세스 권한 부여


151

Postgres를 처음 사용하고 MySQL 데이터베이스를 마이그레이션하려고 시도했습니다. MySQL의에서 나는 부여 할 수 있습니다 SELECT, UPDATE, INSERT, 그리고 DELETE낮은 권한을 가진 사용자에 대한 권한 및 지정된 데이터베이스의 모든 테이블에 적용하는 보조금을 할 수 있습니다. Postgres에는 한 번에 하나씩 각 테이블에 대한 권한을 부여 해야하는 것처럼 보이기 때문에 누락 된 것이 있습니다. 데이터베이스 당 많은 데이터베이스와 수백 개의 테이블이있어서 시작하기가 까다로운 작업처럼 보입니다. 또한 데이터베이스가 작동하면 테이블 추가가 자주 발생하여 꼭 필요한 경우가 아니면 매번 권한을 부여하고 싶지 않습니다.

이것이 어떻게 가장 잘 이루어 집니까?

답변:


175

먼저 쿼리를 실행하려면 데이터베이스에 연결할 수 있어야합니다. 이것은 달성 할 수 있습니다

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필요한 특권이 있습니다.


1
고마워요, FOR some_role나중에 만든 테이블에서 작동하게하기 위해 누락 된 핵심 부분이었습니다. 그러나로 로그인 할 필요가 없었습니다 . some_role기본 관리자로 쿼리를 실행 한 경우에도 작동했습니다 postgres.
JustAMartin

54

그들에게 모든 권한을 부여한다고 가정하면 다음과 같이하십시오.

grant all privileges on database dbname to dbuser;

여기서 dbname데이터베이스 dbuser이름이며 사용자 이름입니다.


44
이것은에 다음과 같은 권한을 추가합니다 데이터베이스 : CREATE, CONNECT, TEMPORARY. 테이블에 대한 권한이 없습니다.
dezso 2013

13
모든 테이블에 대한 비슷한 명령은 다음과 같습니다.GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO dbuser;
Dolan Antenucci

5
나는 이것 또한 유용하다는 것을 알았다 :GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO dbuser;
Paolo

18

데이터베이스 내의 모든 테이블에 대한 모든 권한 부여는

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema_name> TO <username>;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA <schema_name> TO <username>;

15

PostgreSQL을 처음 접했기 때문에 여기에서 잘못된 일이 있었을 수 있습니다. 그러나 이것은 모든 기존 테이블에 대한 권한을 설정하는 문제의 첫 부분 만 해결했습니다.

새 테이블에서 사용자에 대한 권한을 올바르게 설정하려면 생성 된 사용자에 대한 기본 권한을 설정해야합니다.

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, INSERT, UPDATE, DELETE ON tables TO user_name;

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, USAGE ON sequences TO user_name;

2
--Create User

CREATE USER my_user_test WITH LOGIN NOSUPERUSER NOCREATEDB  NOCREATEROLE    INHERIT NOREPLICATION   CONNECTION LIMIT -1 PASSWORD 'xxxxxxx';

-- Grant connect to my data base

GRANT CONNECT ON DATABASE my_db_test TO my_user_test;

-- Grant usage the schema

GRANT USAGE ON SCHEMA my_sch_test TO my_user_test ;

-- Grant all table for SELECT, INSERT, UPDATE, DELETE

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA my_sch_test TO my_user_test;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.