programing

PostgreSQL: Postgre의 사용자에게 모든 권한 부여SQL 데이터베이스

newstyles 2023. 5. 24. 21:44

PostgreSQL: Postgre의 사용자에게 모든 권한 부여SQL 데이터베이스

데이터베이스를 관리자로 만들지 않고 사용자에게 데이터베이스에 대한 모든 권한을 부여합니다.제가 그렇게 하고 싶은 이유는 현재 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의 사용자에게 사용 권한을 부여하여 계속 진행할 수 있지만 테이블에 대한 권한이 없다는 불만이 제기될 수 있습니다.

그래서 제 질문은 DB에 있는 사용자에게 모든 권한을 부여할 수 있는 쉬운 방법이 없을까 하는 것입니다.

저는 Postgre에서 일하고 있습니다.SQL 8.1.23.

모든 명령은 올바른 데이터베이스 클러스터에 연결된 상태에서 실행되어야 합니다.확인하세요.

역할은 데이터베이스 클러스터의 개체입니다.동일한 클러스터의 모든 데이터베이스는 정의된 역할 집합을 공유합니다.데이터베이스/스키마/테이블 등에 따라 권한이 부여/취소됩니다.

역할에는 데이터베이스에 대한 액세스 권한이 필요합니다.그것은 당연한 일입니다PUBLIC결석으로기타:

GRANT CONNECT ON DATABASE my_db TO my_user;

Postgres 14 이상에 대한 기본 권한

Postgres 14는 미리 정의된 비로그인 역할 /을 추가합니다.
그들은 가지고 있습니다.SELECT/INSERT,UPDATE,DELETE모든 테이블, 보기 및 시퀀스에 대한 권한.플러스USAGE도식적으로우린 할 수 있어GRANT다음 역할의 구성원 자격:

GRANT pg_read_all_data TO my_user;
GRANT pg_write_all_data TO my_user;

에서는 모든 명령과 "DDL"과 같은 일부 특수 (DDL은 에 대해 다룹니다.TRUNCATE 는또.EXECUTE기능에 대한 권한!).설명서:

pg_read_all_data

, 를 마치 " " " " " 가 있는 처럼 읽습니다.SELECT개체에 과 해당개대권한및한에체및▁rightsUSAGE모든 스키마에 대한 권한을 명시적으로 가지고 있지 않더라도. 특성이 .BYPASSRLS하는 경우, 는 "RLS", "RLS"를 설정하기를 수 .BYPASSRLS이 이역이역대해인 GRANT에덴토

pg_write_all_data

, 든데테를다같기음다모이니록이합터과스시퀀뷰블이▁if▁having▁all▁(▁write를▁dataINSERT,UPDATE,그리고.DELETE개체에 과 해당개대권한및한에체및▁rightsUSAGE모든 스키마에 대한 권한을 명시적으로 가지고 있지 않더라도. 특성이 .BYPASSRLS하는 경우, 는 "RLS", "RLS"를 설정하기를 수 .BYPASSRLS이 이역이역대해인 GRANT에덴토

미리 정의된 역할을 사용하지 않는 모든 권한(Postgres 버전)

올바른 데이터베이스에 연결된 상태에서 명령을 실행해야 합니다.확인하세요.

역할은 ( 필요합니다.USAGE스키마에 대한 권한.다시 말하지만, 만약 그것이 허락된다면.PUBLIC당신은 보호됩니다. 예:

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 4의 "허가 마법사"를 사용하여 GUI로 작업할 수 있습니다.

여기에는 기존 개체에 대한 권한이 포함됩니다.미래의 객체도 포함하려면 를 설정합니다.참조:

다른 개체도 있습니다. 설명서에는 전체 목록이 나와 있습니다.Postgres 14 기준:

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

하지만 나머지는 거의 필요하지 않습니다.자세한 정보:

현재 버전으로 업그레이드하는 것이 좋습니다.

GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;

포스트그레에서SQL 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 문서를 참조하십시오.

이 기능은 응용 프로그램이 필요로 하는 만큼 정기적으로 슈퍼유저로 실행해야 합니다.옵션은 매일 또는 매시간 실행되는 cron 작업으로 이를 패키지화하는 것입니다.

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

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_dll에서 *를 선택합니다;

데이터베이스가 스냅샷을 쿼리합니다.

포스트그레에서SQL 12 이상에서는 역할/사용자/계정에 데이터베이스에 있는 테이블의 모든 권한을 부여할 수 있습니다.

구문은 다음과 같습니다.

GRANT ALL ON table_name TO role_name;

데이터베이스의 모든 테이블에 권한을 부여하려는 경우 구문은 다음과 같습니다.

GRANT ALL ON ALL TABLES TO role_name;

데이터베이스에 있는 스키마의 모든 테이블에 이를 부여하려면 구문은 다음과 같습니다.

GRANT ALL ON ALL TABLES IN SCHEMA schema_name TO role_name;

참고: 데이터베이스 권한을 사용자에게 부여하려면 먼저 데이터베이스를 선택해야 합니다.

리소스:포스트그레SQL GRANT

이상입니다

이것이 도움이 되길 바랍니다.

사용자에게 SCHEMAschema_name에 대한 사용 권한 부여;

GRANT ALL ON SCHEMA schema_name TO user_name;

Postgre의 사용자에게 모든 권한 부여SQL 데이터베이스:

명령:

grant all privileges on database [database_name] to [database_user_name];

예:

grant all privileges on database studentdb to shaifullah;

OR

GRANT ALL PRIVILEGES ON DATABASE studentdb TO shaifullah;

언급URL : https://stackoverflow.com/questions/22483555/postgresql-give-all-permissions-to-a-user-on-a-postgresql-database