DB의 사용자에게 모든 권한 부여


206

데이터베이스를 관리자 권한으로 만들지 않고 사용자에게 데이터베이스에 대한 모든 권한을 부여하고 싶습니다. 내가하고 싶은 이유는 현재 DEV와 PROD가 동일한 클러스터의 다른 DB이므로 사용자가 프로덕션 객체를 변경할 수는 없지만 DEV의 객체를 변경할 수 있어야하기 때문입니다.

나는 시도했다 :

grant ALL on database MY_DB to group MY_GROUP;

그러나 권한을 부여하지 않는 것 같습니다.

그런 다음 시도했습니다.

grant all privileges on schema MY_SCHEMA to group MY_GROUP;

그리고 객체를 만들 수는 있지만 다른 사용자에게 속한 해당 스키마의 객체를 쿼리 / 삭제 할 수는 없습니다.

MY_SCHEMA의 사용자에게 USAGE 권한을 부여하여 계속 진행할 수는 있지만 테이블에 대한 권한이없는 것에 대해 불평합니다 ...

그래서 내 질문은 다음과 같습니다 .DB의 사용자에게 모든 권한을 부여하는 쉬운 방법이 있습니까?

PostgreSQL 8.1.23에서 작업하고 있습니다.

답변:


271

사용자는 분명히 데이터베이스에 액세스해야합니다 .

GRANT CONNECT ON DATABASE my_db TO my_user;

그리고 적어도 스키마USAGE 에 대한 권한 :

GRANT USAGE ON SCHEMA public TO my_user;

또는 부여 USAGE모든 사용자 정의 스키마 :

DO
$$
BEGIN
   -- RAISE NOTICE '%', (  -- use instead of EXECUTE to see generated commands
   EXECUTE (
   SELECT string_agg(format('GRANT USAGE ON SCHEMA %I TO my_user', nspname), '; ')
   FROM   pg_namespace
   WHERE  nspname <> 'information_schema' -- exclude information schema and ...
   AND    nspname NOT LIKE 'pg\_%'        -- ... system schemas
   );
END
$$;

그런 다음 모든 테이블에 대한 모든 권한 (Postgres 9.0 이상이 필요 ).
그리고 시퀀스 (있는 경우)를 잊지 마십시오 :

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO my_user;

들어 이전 버전 당신은 pgAdmin III의 "그랜트 마법사"(기본 GUI)를 사용할 수 있습니다.

다른 객체가 있습니다 . 매뉴얼GRANT 에는 Postgres 12의 전체 목록이 있습니다.

데이터베이스 객체 (테이블, 열, 뷰, 외부 테이블, 시퀀스, 데이터베이스, 외부 데이터 래퍼, 외부 서버, 함수, 프로 시저, 절차 언어, 스키마 또는 테이블 스페이스)에 대한 권한

그러나 나머지는 거의 필요하지 않습니다. 자세한 내용은:

현재 버전으로 업그레이드 하십시오 .


133
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;

24
모든 권한을 부여 ON DATABASE하는 것은 큰 소리가 들리지만 그렇게하지는 않습니다. 시작일뿐입니다. 포함 된 개체에 대한 권한을 부여하지 않습니다.
Erwin Brandstetter

50

PostgreSQL 9.0 이상에서는 다음을 수행합니다.

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA MY_SCHEMA TO MY_GROUP;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA MY_SCHEMA TO MY_GROUP;

새로 작성된 관계에서도이 기능을 사용하려면 기본 권한을 설정하십시오.

ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON TABLES TO MY_GROUP;
ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON SEQUENCES TO MY_GROUP;

그러나 8.1을 사용한다는 것을 알면 직접 코딩해야합니다.

CREATE FUNCTION grant_all_in_schema (schname name, grant_to name) RETURNS integer AS $$
DECLARE
  rel RECORD;
BEGIN
  FOR rel IN
    SELECT c.relname
    FROM pg_class c
    JOIN pg_namespace s ON c.namespace = s.oid
    WHERE s.nspname = schname
  LOOP
    EXECUTE 'GRANT ALL PRIVILEGES ON ' || quote_ident(schname) || '.' || rel.relname || ' TO ' || quote_ident(grant_to);
  END LOOP;
  RETURN 1;
END; $$ LANGUAGE plpgsql STRICT;
REVOKE ALL ON FUNCTION grant_all_in_schema(name, name) FROM PUBLIC;

테이블, 뷰, 인덱스, 시퀀스 등 모든 관계에 대한 권한을 설정합니다. 제한하려면 필터를 설정하십시오 pg_class.relkind. 자세한 내용은 pg_class 문서 를 참조하십시오.

이 기능은 수퍼 유저 및 응용 프로그램이 요구하는대로 정기적으로 실행해야합니다. 옵션은 매일 또는 매시간 실행되는 크론 작업에서이를 패키지하는 것입니다.


안녕하세요 Patrick, 8.1에서는 "ALL TABLES"를 사용할 수 없습니다 ( postgresql.org/docs/8.1/static/sql-grant.html ) 테이블을 반복하고 권한을 개별적으로 부여 할 수 있다는 것을 알고 있습니다. 피하려고합니다. 도와 주셔서 감사합니다
Diego

@Diego : 8.1에 대한 솔루션 추가
Patrick

고마워 패트릭, 난 당신과 같은 것을 사용하지만 결국 "모두 GRANT"를 사용하지 않았다. 어떤 이유로 든 아무것도하지 않는 것 같습니다. 예를 들어, 나는 다음을 실행했습니다 : 스키마 테스트에 ALL을 userA에게 부여하십시오. 그러나 그 후에도 A 사용자는 여전히 스키마 테스트 테이블에서 읽을 수있는 권한이 없습니다
Diego

2
스키마에 대한 사용 권한을 부여해야합니다. 그런 다음 해당 스키마 내의 모든 관계 (테이블, 뷰, 시퀀스, 인덱스 등)에서 SELECT, INSERT, UPDATE, DELETE, TRUNCATE를 별도로 부여해야합니다. 스키마는 네임 스페이스이고 관계는 데이터가있는 위치입니다.
Patrick

28

PostgreSQL 9.4.15 데이터베이스에 'eSumit'역할을 추가하고이 역할에 대한 모든 권한을 제공하기 위해 다음을 수행했습니다.

CREATE ROLE eSumit;

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO eSumit;

GRANT ALL PRIVILEGES ON DATABASE "postgres" to eSumit;

ALTER USER eSumit WITH SUPERUSER;

다음을 통해 pg_table 엔터티도 확인했습니다.

pg_roles에서 *를 선택하십시오. 여기에 이미지 설명을 입력하십시오

데이터베이스 쿼리 스냅 샷 : 여기에 이미지 설명을 입력하십시오


Postgres 버전 10.3이 있으며 데이터베이스 이름 주위에 따옴표를 사용하면 구문 오류가 발생합니다.
sajid
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.