한양과학기술고등학교

에듀테크 프로젝트 대시보드

역할 · 데이터베이스 · 스키마

CREATE ROLE OWNER GRANT public schema 권한

PostgreSQL 에는 '사용자'와 '그룹'이 따로 없고 역할(ROLE) 하나로 통합돼 있습니다. LOGIN 속성이 있으면 접속 계정입니다.

1. 앱용 역할과 DB 만들기

-- 슈퍼유저(postgres)로 실행
CREATE ROLE school WITH LOGIN PASSWORD 'change-me';
CREATE DATABASE school OWNER school;

-- 접속 제한 예
ALTER ROLE school CONNECTION LIMIT 20;
ALTER ROLE school VALID UNTIL '2027-01-01';
# psql 밖에서 쓰는 래퍼 (Ubuntu)
sudo -u postgres createuser --interactive --pwprompt school
sudo -u postgres createdb -O school school

2. 역할 속성

속성의미
LOGIN / NOLOGIN접속 가능 여부 (그룹 역할은 NOLOGIN)
SUPERUSER모든 권한 우회 — 앱 계정엔 절대 부여 금지
CREATEDB / CREATEROLEDB·역할 생성 권한
REPLICATION복제 연결용

3. 그룹 역할로 권한 묶기

CREATE ROLE app_read NOLOGIN;
CREATE ROLE app_write NOLOGIN;

GRANT SELECT ON ALL TABLES IN SCHEMA public TO app_read;
GRANT app_read TO reporting_user;   -- 상속
GRANT app_read, app_write TO school;

새로 만들어질 테이블에도 자동 적용하려면 ALTER DEFAULT PRIVILEGES 를 함께 걸어야 합니다.

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT ON TABLES TO app_read;

4. public 스키마 주의 (PG15+)

달라진 점
  • PG15 부터 일반 역할은 public 스키마에 기본적으로 테이블을 만들 수 없음
  • 해결: DB 를 그 역할이 OWNER 로 소유하거나 GRANT CREATE ON SCHEMA public TO school;
-- 스키마 분리 운영 예
CREATE SCHEMA app AUTHORIZATION school;
ALTER ROLE school SET search_path = app, public;
"VACUUM 은 선택이 아니라 MVCC 가 물리는 세금이다"