PostgreSQL | 데이터베이스(Database) | 데이터베이스 변경 (ALTER DATABASE)

ALTER DATABASE 명령을 사용하여 생성된 데이터베이스를 변경하는 방법에 대해 설명한다.

데이터베이스 설정 변경

먼저 데이터베이스마다 설정을 변경하는 방법에 대해 알아보자. 형식은 다음과 같다.

ALTER DATABASE name [ [ WITH ] option [ ... ] ]

option:
    ALLOW_CONNECTIONS allowconn
    CONNECTION LIMIT connlimit
    IS_TEMPLATE istemplate

데이터베이스(name)의 설정을 변경한다. 변경할 수 있는 설정은 데이터베이스를 만들 때 설정 할 수있는 ALLOW_CONNECTIONS, CONNECTION LIMIT, IS_TEMPLATE 3가지 이다.

데이터베이스의 설정을 변경하려면, 명령을 수행하는 역할이 수퍼 유저이거나 데이터베이스 소유자이어야 한다.

그러면 실제로 해보도록 하자. 먼저 수퍼 유저의 역할 hamster 데이터베이스를 만든다. 이때 동시 연결 수를 설정하는 CONNECTION LIMIT를 5로 설정한다.

devkuma=# create database hamster connection limit 5;
CREATE DATABASE
devkuma=#

데이터베이스가 작성되었다. 확인을 위해 시스템 카탈로그의 하나 인 pg_database에서 데이터베이스 목록과 동시 연결 수를 조회해 본다.

devkuma=# select datname, datconnlimit from pg_database;
  datname  | datconnlimit
-----------+--------------
 postgres  |           -1
 template1 |           -1
 template0 |           -1
 sample    |           -1
 devkuma   |           -1
 devkuma2  |           -1
 hamster   |            5
(7개 행)


devkuma=#

hamster 데이터베이스가 작성되고 있고, 동시 연결 수가 5로 되어있는 것을 확인할 수 있다.

그러면 ALTER DATABASE 명령을 사용하여 hamster 데이터베이스의 동시 연결 수를 3으로 변경하려고 한다. 다음과 같이 실행한다.

devkuma=# alter database hamster connection limit 3;
ALTER DATABASE
devkuma=#

동시 연결 수가 3으로 변경되었다. 확인을 위해 다시 pg_database에서 데이터베이스 목록과 동시 연결 수를 조회한다.

devkuma=# select datname, datconnlimit from pg_database;
  datname  | datconnlimit
-----------+--------------
 postgres  |           -1
 template1 |           -1
 template0 |           -1
 sample    |           -1
 devkuma   |           -1
 devkuma2  |           -1
 hamster   |            3
(7개 행)


devkuma=#

hamster 데이터베이스의 동시 연결 수가 3으로 되어있는 것을 확인할 수 있다.

데이터베이스 이름 변경

다음 데이터베이스의 이름을 변경하는 방법에 대해 알아보자. 형식은 다음과 같다.

ALTER DATABASE name RENAME TO new_name

데이터베이스(name) 이름을 다른 이름(new_name)으로 변경한다.

데이터베이스의 이름을 변경하려면, 명령을 수행하는 역할이 수퍼 유저 또는 데이터베이스 소유자이면서 CREATEDB 권한을 가지고 있어야 한다. 연결된 데이터베이스의 이름을 변경할 수 없다.

그러면 실제로 해보도록 하자. 방금 만든 hamster 데이터베이스의 이름을 rabbit로 변경한다. 다음과 같이 실행한다.

devkuma=# alter database hamster rename to rabbit;
ALTER DATABASE
devkuma=#

데이터베이스의 이름을 변경 할 수 있었다. 확인을 위해 pg_database에서 데이터베이스 목록을 조회해 본다.

devkuma=# select datname, pg_authid.rolname as dbrollname
devkuma-#   from pg_database
devkuma-#   join pg_authid on pg_authid.oid = pg_database.datdba;
  datname  | dbrollname
-----------+------------
 rabbit    | postgres   <<<<< hamster에서 rabbit으로 변경
 devkuma2  | postgres
 devkuma   | postgres
 sample    | postgres
 template0 | postgres
 template1 | postgres
 postgres  | postgres
(7개 행)


devkuma=#

hamster 데이터베이스의 이름이 rabbit으로 바뀌어있는 것을 확인할 수 있다.

데이터베이스 소유자를 변경

다음 데이터베이스의 소유자를 변경하는 방법이다. 다음 형식을 사용한다.

ALTER DATABASE name OWNER TO {new_owner | CURRENT_USER | SESSION_USER}

데이터베이스(name)의 소유자를 다른 역할(new_owner)로 변경한다.

데이터베이스의 이름을 변경하려면, 명령을 수행하는 역할이 수퍼 유저이거나 데이터베이스 소유자이면서 새로운 소유자의 직접 또는 간접적으로 멤버이며, CREATEDB 권한을 가지고 있어야 한다.

그러면 실제로 해보도록 한다. 생성된 rabbit 데이터베이스의 소유자는 현재 postgres 역할이다.

devkuma=# \l rabbit
                               데이터베이스 목록
  이름  |  소유주  | 인코딩 |     Collate      |      Ctype       | 액세스 권한
--------+----------+--------+------------------+------------------+-------------
 rabbit | postgres | UTF8   | Korean_Korea.949 | Korean_Korea.949 |
(1개 행)


devkuma=#

rabbit 데이터베이스의 소유자를 orange 역할로 변경하려고 한다. 먼저, orange 역할을 만들고, 다음과 같이 실행한다.

devkuma=# create role orange with login password 'apple';
CREATE ROLE
devkuma=#

데이터베이스의 소유자가 변경되었다. 확인을 위해 다시 \l 명령을 실행해 본다.

devkuma=# alter database rabbit owner to orange;
ALTER DATABASE
devkuma=# \l rabbit
                              데이터베이스 목록
  이름  | 소유주 | 인코딩 |     Collate      |      Ctype       | 액세스 권한
--------+--------+--------+------------------+------------------+-------------
 rabbit | orange | UTF8   | Korean_Korea.949 | Korean_Korea.949 |
(1개 행)


devkuma=#

rabbit 데이터베이스의 소유자가 orange 역할로 변경되는 것을 확인할 수 있다.

그 밖에

ALTER DATABASE 명령에는 그 밖에 다음과 같은 형식이 준비되어 있다.

ALTER DATABASE name SET TABLESPACE new_tablespace

ALTER DATABASE name SET configuration_parameter { TO | = } { value | DEFAULT }
ALTER DATABASE name SET configuration_parameter FROM CURRENT
ALTER DATABASE name RESET configuration_parameter
ALTER DATABASE name RESET ALL

여기까지 ALTER DATABASE 명령을 사용하여 데이터베이스를 변경하는 방법에 대해 설명하였다.