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

데이터베이스를 관리자 권한으로 만들지 않고 사용자에게 데이터베이스에 대한 모든 권한을 부여하고 싶습니다. 내가하고 싶은 이유는 현재 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에서 작업하고 있습니다.



답변

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

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의 전체 목록이 있습니다.

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

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

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


답변

GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;


답변

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 문서 를 참조하십시오.

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


답변

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에서 *를 선택하십시오.
여기에 이미지 설명을 입력하십시오

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


답변