ALTER DEFAULT PRIVILEGES — 기본 접근 권한 정의하기

ALTER DEFAULT PRIVILEGES — 기본 접근 권한 정의하기

ALTER DEFAULT PRIVILEGES는 앞으로 만들어질 객체에 적용될 기본 권한을 설정하는 명령이에요. 이미 존재하는 객체에 부여된 권한은 건드리지 않아요. 새 테이블이나 함수가 생길 때마다 일일이 GRANT를 붙이기 싫을 때, 데이터베이스 차원에서 기본 권한을 미리 정해두는 거예요.

출처: PostgreSQL 문서

본문

시놉시스 (Synopsis)

ALTER DEFAULT PRIVILEGES
    [ FOR { ROLE | USER } target_role [, ...] ]
    [ IN SCHEMA schema_name [, ...] ]
    abbreviated_grant_or_revoke

where abbreviated_grant_or_revoke is one of:

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | MAINTAIN }
    [, ...] | ALL [ PRIVILEGES ] }
    ON TABLES
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { { USAGE | SELECT | UPDATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON SEQUENCES
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON { FUNCTIONS | ROUTINES }
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON TYPES
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { { USAGE | CREATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMAS
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { { SELECT | UPDATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON LARGE OBJECTS
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | MAINTAIN }
    [, ...] | ALL [ PRIVILEGES ] }
    ON TABLES
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { USAGE | SELECT | UPDATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON SEQUENCES
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { EXECUTE | ALL [ PRIVILEGES ] }
    ON { FUNCTIONS | ROUTINES }
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON TYPES
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { USAGE | CREATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMAS
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | UPDATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON LARGE OBJECTS
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

설명 (Description)

ALTER DEFAULT PRIVILEGES는 앞으로 만들어질 객체에 적용될 권한을 설정하게 해 줘요. (이미 존재하는 객체에 부여된 권한에는 영향을 주지 않아요.) 권한은 전역으로(즉 현재 데이터베이스에서 만들어지는 모든 객체에 대해) 또는 지정된 스키마에서 만들어지는 객체에만 설정할 수 있어요.

자기 자신의 기본 권한이나 자신이 멤버로 속한 역할의 기본값을 바꿀 수는 있지만, 객체 생성 시점에 새 객체의 권한은 현재 역할의 기본 권한에 의해서만 영향을 받고, 현재 역할이 멤버로 속한 어떤 역할에서도 상속되지 않아요.

5.8절에서 설명하듯, 어떤 객체 타입의 기본 권한은 보통 객체 소유자에게 모든 부여 가능한 권한을 주고 PUBLIC에게도 일부 권한을 줄 수 있어요. 하지만 이 동작은 ALTER DEFAULT PRIVILEGES로 전역 기본 권한을 바꿔서 변경할 수 있어요.

현재 스키마, 테이블(뷰와 외부 테이블 포함), 시퀀스, 함수, 타입(도메인 포함), 대형 객체의 권한만 바꿀 수 있어요. 이 명령에서 함수는 집계 함수와 프로시저를 포함해요. FUNCTIONSROUTINES라는 단어는 이 명령에서 동등해요. (ROUTINES는 함수와 프로시저를 합친 표준 용어로 앞으로 선호돼요. 이전 PostgreSQL 릴리스에서는 FUNCTIONS라는 단어만 허용됐어요. 함수와 프로시저의 기본 권한을 따로 설정하는 것은 불가능해요.)

스키마별로 지정된 기본 권한은 해당 객체 타입에 대한 전역 기본 권한에 더해져요. 즉, 전역으로 부여된 권한(기본이거나 스키마를 지정하지 않은 이전 ALTER DEFAULT PRIVILEGES 명령에 따른 권한)을 스키마별로는 취소할 수 없어요. 스키마별 REVOKE는 이전 스키마별 GRANT의 효과를 되돌리는 데만 유용해요.

매개변수 (Parameters)

  • target_roletarget_role이 만든 객체, 또는 지정하지 않으면 현재 역할이 만든 객체에 대한 기본 권한을 바꿔요.
  • schema_name — 기존 스키마의 이름이에요. 지정하면 나중에 그 스키마에서 만들어지는 객체에 대한 기본 권한을 바꿔요. IN SCHEMA를 생략하면 전역 기본 권한을 바꿔요. 스키마는 중첩될 수 없고 대형 객체는 스키마에 속하지 않으므로, 스키마와 대형 객체에 대한 권한을 설정할 때는 IN SCHEMA를 쓸 수 없어요.
  • role_name — 권한을 부여하거나 취소할 기존 역할의 이름이에요. 이 매개변수와 abbreviated_grant_or_revoke의 다른 모든 매개변수는 특정 이름의 객체가 아니라 객체 클래스 전체에 권한을 설정한다는 점만 빼고 GRANT나 REVOKE에서 설명한 대로 동작해요.

참고 (Notes)

기본 권한이 변경된 역할을 드롭하고 싶다면 그 기본 권한 변경을 되돌리거나 DROP OWNED BY를 써서 그 역할의 기본 권한 항목을 제거해야 해요.

예제 (Examples)

스키마 myschema에서 앞으로 만들 모든 테이블(그리고 뷰)에 대해 모두에게 SELECT 권한을 부여하고, 역할 webuser도 INSERT할 수 있게 하려면:

ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT ON TABLES TO PUBLIC;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT INSERT ON TABLES TO webuser;

위를 되돌려서, 이후 만들어진 테이블이 평소보다 더 많은 권한을 갖지 않게 하려면:

ALTER DEFAULT PRIVILEGES IN SCHEMA myschema REVOKE SELECT ON TABLES FROM PUBLIC;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema REVOKE INSERT ON TABLES FROM webuser;

역할 admin이 이후 만드는 모든 함수에 대해, 함수에 보통 부여되는 공개 EXECUTE 권한을 없애려면:

ALTER DEFAULT PRIVILEGES FOR ROLE admin REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;

다만 단일 스키마로 한정한 명령으로는 그 효과를 낼 수 없어요. 다음 명령은 일치하는 GRANT를 되돌리는 게 아니면 아무 효과가 없어요:

ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;

그 이유는 스키마별 기본 권한은 전역 설정에 권한을 더할 수만 있고, 전역이 부여한 권한을 제거할 수는 없기 때문이에요.

호환성 (Compatibility)

SQL 표준에는 ALTER DEFAULT PRIVILEGES 문이 없어요.

더 알아보기 (Learn more)

  • GRANT — 권한을 부여하는 명령이에요.
  • REVOKE — 권한을 취소하는 명령이에요.
  • DROP OWNED BY — 역할의 기본 권한 항목을 정리할 수 있어요.