ALTER ROLE

ALTER ROLE

ALTER ROLE은 PostgreSQL 역할(role)의 속성, 이름, 세션 기본 설정을 변경하는 명령이에요. 비밀번호 변경, 권한 부여, 세션 기본 설정값 지정 등을 할 수 있어요.

출처: PostgreSQL 문서

본문

문법 (Synopsis)

ALTER ROLE role_specification [ WITH ] option [ ... ]

where option can be:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL
    | VALID UNTIL 'timestamp'

ALTER ROLE name RENAME TO new_name

ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] SET configuration_parameter { TO | = } { value | DEFAULT }
ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] SET configuration_parameter FROM CURRENT
ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] RESET configuration_parameter
ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] RESET ALL

where role_specification can be:

    role_name
  | CURRENT_ROLE
  | CURRENT_USER
  | SESSION_USER

설명 (Description)

ALTER ROLE은 PostgreSQL 역할의 속성을 변경해요.

문법에 나열된 이 명령의 첫 번째 변형은 CREATE ROLE에서 지정할 수 있는 많은 역할 속성을 변경할 수 있어요. (가능한 모든 속성이 다루어지는데, 멤버십 추가·제거 옵션만 없어요. 그것은 GRANTREVOKE를 사용하세요.) 명령에서 언급되지 않은 속성은 이전 설정을 그대로 유지해요. 데이터베이스 슈퍼유저는 부트스트랩 슈퍼유저의 SUPERUSER 속성 변경을 제외하고 어떤 역할의 어떤 설정이든 바꿀 수 있어요. CREATEROLE 권한을 가진 비슈퍼유저 역할은 대부분의 속성을 바꿀 수 있지만, ADMIN OPTION을 부여받은 비슈퍼유저·비복제 역할에 대해서만 가능해요. 비슈퍼유저는 SUPERUSER 속성을 바꿀 수 없고, CREATEDB, REPLICATION, BYPASSRLS 속성은 자신이 해당 속성을 가진 경우에만 바꿀 수 있어요. 일반 역할은 자기 자신의 비밀번호만 바꿀 수 있어요.

두 번째 변형은 역할의 이름을 변경해요. 데이터베이스 슈퍼유저는 아무 역할 이름이든 바꿀 수 있어요. CREATEROLE 권한을 가진 역할은 ADMIN OPTION을 부여받은 비슈퍼유저 역할의 이름을 바꿀 수 있어요. 현재 세션 사용자는 이름을 바꿀 수 없어요. (그렇게 해야 한다면 다른 사용자로 접속하세요.) MD5 암호화 비밀번호는 역할 이름을 암호학적 소금(salt)으로 사용하기 때문에, 역할 이름을 바꾸면 비밀번호가 MD5로 암호화되어 있을 경우 비밀번호가 지워져요.

나머지 변형은 구성 변수에 대한 역할의 세션 기본값을 변경해요. 모든 데이터베이스에 적용되거나, IN DATABASE 절을 지정하면 해당 이름의 데이터베이스 세션에만 적용돼요. 역할 이름 대신 ALL을 지정하면 모든 역할에 대한 설정을 변경해요. IN DATABASE와 함께 ALL을 쓰는 것은 ALTER DATABASE ... SET ... 명령을 쓰는 것과 사실상 같아요.

역할이 이후 새 세션을 시작할 때마다 지정된 값이 세션 기본값이 되어, postgresql.conf에 있거나 postgres 명령줄에서 받은 설정을 덮어써요. 이것은 로그인 시에만 일어나요. SET ROLE이나 SET SESSION AUTHORIZATION을 실행해도 새 구성 값이 적용되지는 않아요. 모든 데이터베이스에 대한 설정은 역할에 연결된 데이터베이스별 설정으로 덮어써져요. 특정 데이터베이스나 특정 역할에 대한 설정은 모든 역할에 대한 설정을 덮어써요.

슈퍼유저는 누구의 세션 기본값이든 바꿀 수 있어요. CREATEROLE 권한을 가진 역할은 ADMIN OPTION을 부여받은 비슈퍼유저 역할의 기본값을 바꿀 수 있어요. 일반 역할은 자기 자신의 기본값만 설정할 수 있어요. 어떤 구성 변수는 이 방법으로 설정할 수 없거나, 슈퍼유저가 명령을 실행할 때만 설정할 수 있어요. 모든 역할·모든 데이터베이스에 대한 설정을 바꿀 수 있는 것은 슈퍼유저뿐이에요.

파라미터 (Parameters)

name — 속성을 변경할 역할의 이름이에요.

CURRENT_ROLE / CURRENT_USER — 명시적으로 식별된 역할 대신 현재 사용자를 변경해요.

SESSION_USER — 명시적으로 식별된 역할 대신 현재 세션 사용자를 변경해요.

SUPERUSER / NOSUPERUSER, CREATEDB / NOCREATEDB, CREATEROLE / NOCREATEROLE, INHERIT / NOINHERIT, LOGIN / NOLOGIN, REPLICATION / NOREPLICATION, BYPASSRLS / NOBYPASSRLS, CONNECTION LIMIT connlimit, [ ENCRYPTED ] PASSWORD 'password', PASSWORD NULL, VALID UNTIL 'timestamp' — 이 절들은 원래 CREATE ROLE에서 설정된 속성을 변경해요. 자세한 내용은 CREATE ROLE 레퍼런스 페이지를 참고하세요.

new_name — 역할의 새 이름이에요.

database_name — 구성 변수를 설정할 데이터베이스의 이름이에요.

configuration_parameter / value — 지정된 구성 파라미터에 대한 이 역할의 세션 기본값을 지정된 값으로 설정해요. valueDEFAULT이거나 동등하게 RESET을 쓰면 역할별 변수 설정이 제거되어, 역할이 새 세션에서 시스템 전체 기본값을 상속해요. RESET ALL을 쓰면 모든 역할별 설정을 지워요. SET FROM CURRENT는 세션의 현재 파라미터 값을 역할별 값으로 저장해요. IN DATABASE를 지정하면 구성 파라미터가 해당 역할과 데이터베이스에 대해서만 설정되거나 제거돼요.

역할별 변수 설정은 로그인 시에만 적용돼요. SET ROLESET SESSION AUTHORIZATION은 역할별 변수 설정을 처리하지 않아요.

허용되는 파라미터 이름과 값에 대한 자세한 내용은 SET과 Chapter 19를 참고하세요.

주의 (Notes)

새 역할을 추가하려면 CREATE ROLE을, 역할을 제거하려면 DROP ROLE을 사용해요.

ALTER ROLE은 역할의 멤버십을 변경할 수 없어요. 그것은 GRANTREVOKE로 해야 해요.

이 명령으로 암호화되지 않은 비밀번호를 지정할 때는 주의해야 해요. 비밀번호는 평문으로 서버에 전송되고, 클라이언트의 명령 기록이나 서버 로그에 기록될 수도 있어요. psql에는 비밀번호 평문을 노출하지 않고 역할 비밀번호를 변경할 수 있는 \password 명령이 있어요.

세션 기본값을 역할이 아니라 특정 데이터베이스에 연결하는 것도 가능해요. ALTER DATABASE를 참고하세요. 충돌이 있으면 데이터베이스 역할별 설정이 역할별 설정을 덮어쓰고, 그것이 다시 데이터베이스별 설정을 덮어써요.

예제 (Examples)

역할의 비밀번호를 바꾸려면:

ALTER ROLE davide WITH PASSWORD 'hu8jmn3';

역할의 비밀번호를 제거하려면:

ALTER ROLE davide WITH PASSWORD NULL;

비밀번호 만료일을 바꾸되, UTC보다 한 시간 앞선 시간대를 기준으로 2015년 5월 4일 정오에 만료되도록 지정하려면:

ALTER ROLE chris VALID UNTIL 'May 4 12:00:00 2015 +1';

비밀번호를 영구 유효하게 만들려면:

ALTER ROLE fred VALID UNTIL 'infinity';

역할에게 다른 역할 관리와 새 데이터베이스 생성 능력을 주려면:

ALTER ROLE miriam CREATEROLE CREATEDB;

역할에게 maintenance_work_mem 파라미터의 비기본 설정을 주려면:

ALTER ROLE worker_bee SET maintenance_work_mem = 100000;

역할에게 client_min_messages 파라미터의 비기본·데이터베이스별 설정을 주려면:

ALTER ROLE fred IN DATABASE devel SET client_min_messages = DEBUG;

호환성 (Compatibility)

ALTER ROLE 문은 PostgreSQL 확장 기능이에요.

더 알아보기 (Learn more)

  • 역할의 멤버십 변경은 ALTER ROLE로 할 수 없고 GRANT/REVOKE로 해야 해요.
  • 역할별 구성 설정은 로그인 시에만 적용되고, SET ROLE/SET SESSION AUTHORIZATION에서는 적용되지 않아요.
  • MD5 비밀번호는 역할 이름을 소금으로 쓰기 때문에, 역할 이름을 바꾸면 MD5 비밀번호가 지워져요.