데이터베이스의 모든 스키마에 대한 전체 사용량?


13

GRANT USAGE주어진 데이터베이스에 대한 사용자 / 역할을 원합니다 . 데이터베이스에는 많은 스키마가 있습니다.

이 있다는 것을 알고 ON ALL TABLES IN SCHEMA있지만 "모든 스키마"를 원합니다. 나는 시도 GRANT USAGE .. ON DATABASE했지만 분명히 틀렸다 (실제로는 존재 하지 않는다 ).

Postgres 9.3 또는 9.4 용이며 AWS RDS에있는 서버입니다.

답변:


18

최소한 두 가지 옵션이 있습니다.

첫 번째 는 작은 쿼리와 텍스트 편집기를 사용합니다. 관심있는 스키마를 수집해야합니다.

SELECT nspname
  FROM pg_namespace;

WHERE범위를 제한하려는 경우 절을 추가 할 수 있습니다 . 출력을 복사하고 수정하여 많은 GRANT USAGE ON SCHEMA ... TO your_role;명령 을 얻습니다 . 그런 다음 psql에 예를 들어

psql -f multigrant.sql

이것의 일반적인 변형은 수집 된 이름과 호출을 반복 psql하고 생성 된 GRANT문을 -c옵션에 전달 하는 쉘 스크립트 일 수 있습니다 .

다른 솔루션 은 기본적으로 하나의 pl / pgsql 블록에서 동일하게 수행되어 동적 쿼리를 작성합니다. 핵심은 동일합니다. 스키마를 수집해야합니다. 그런 다음 스키마별로 권한 스키마를 부여하여 모든 항목을 반복합니다.

DO $do$
DECLARE
    sch text;
BEGIN
    FOR sch IN SELECT nspname FROM pg_namespace
    LOOP
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch);
    END LOOP;
END;
$do$;

참고 사항 :

  • 테이블, 시퀀스, 함수 및 유형과 달리 schemata에 대한 기본 권한 을 설정할 수 없습니다 (9.4 현재). 새로 추가 된 스키마에 대해이 권한을 수동으로 부여해야합니다.
  • 여기 에 동적 쿼리를 작성할 때 달러 인용을 사용 하고 있습니다. 예를 들어 작은 따옴표를 곱하는 것과는 달리 '정상'구문을 사용할 수 있습니다 (이 예에는 없음). 이런 식으로 대부분의 편집자들은 그 문장을 잘 강조 할 것입니다.
  • 또한 필요한 경우 개체 이름을 올바르게 인용하기 format()위해 %I형식 지정자 와 함께 사용 합니다. 이 방법은 문자열 상수와 일부 quote_ident()호출 을 연결하여 쿼리를 작성하는 것보다 훨씬 읽기 쉽습니다 .
  • pg_namespacepg_catalog스키마 에서 찾을 수 있습니다 . 다른 객체를 확인하십시오-스키마, 테이블 등의 모든 측면을 저장합니다.

1
grant usage새 스키마에 대해 자동으로 실행되는 이벤트 트리거를 사용하여 새로 작성된 스키마에 대한 기본 권한을 시뮬레이션 할 수 있는지 궁금합니다 .
a_horse_with_no_name

@a_horse_with_no_name 그것에 대해 생각하고 있는데, 나는 그것이 왜 그렇게 할 수 없는지 알 수 없습니다.
dezso

0

당신도 사용할 수 있습니다.

DO $do$
DECLARE
    sch text;
BEGIN
    FOR sch IN SELECT nspname FROM pg_namespace where nspname != 'pg_toast' 
    and nspname != 'pg_temp_1' and nspname != 'pg_toast_temp_1'
    and nspname != 'pg_statistic' and nspname != 'pg_catalog'
    and nspname != 'information_schema'
    LOOP
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch);
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I to your_role $$, sch);
        EXECUTE format($$ GRANT SELECT ON ALL SEQUENCES IN SCHEMA %I TO your_role $$, sch);
        EXECUTE format($$ GRANT SELECT ON ALL TABLES IN SCHEMA %I TO backup_user $$, sch);

        EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON TABLES TO your_role $$, sch);
        EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON SEQUENCES TO your_role $$, sch);
    END LOOP;
END;
$do$;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.