DCL(Data Control Language)는 데이터베이스에서 접근 권한을 관리하고 보안을 유지하기 위한 SQL이다.
누가 어떤 데이터에 읽기/쓰기/변경/삭제 권한을 가지는지를 설정하거나 회수할 때 사용하는 명령어이다.
| 명령어 | 설명 |
|---|---|
GRANT | 사용자에게 권한을 부여합니다. |
REVOKE | 기존에 부여한 권한을 회수합니다. |
일부 DBMS에서는 DENY, AUDIT, NOAUDIT 같은 확장 DCL도 존재하지만 표준 SQL에서는 위 두 개가 핵심이다.
-- 사용자 'kim'에게 'employees' 테이블의 SELECT 권한을 부여
GRANT SELECT ON employees TO kim;
-- INSERT와 UPDATE 권한을 함께 부여
GRANT INSERT, UPDATE ON employees TO kim;
-- 'kim'에게 부여했던 SELECT 권한 회수
REVOKE SELECT ON employees FROM kim;
-- 'kim'가 다른 사용자에게도 권한을 부여할 수 있게 허용
GRANT SELECT ON employees TO kim WITH GRANT OPTION;
kim은 이제 다른 사람에게도 SELECT권한을 넘길 수 있다.
| 권한 종류 | 설명 |
|---|---|
SELECT | 데이터를 조회할 수 있음 |
INSERT | 데이터를 삽입할 수 있음 |
UPDATE | 데이터를 수정할 수 있음 |
DELETE | 데이터를 삭제할 수 있음 |
EXECUTE | 프로시저나 함수 실행 가능 |
ALL | 모든 권한을 의미 |
권한은 특정 데이터베이스 객체에 부여된다.
CREATE USER kim WITH PASSWORD 'password';
-- ROLE 생성
CREATE ROLE sales_team;
-- ROLE에 권한 부여
GRANT SELECT, INSERT ON orders TO sales_team;
-- 사용자에게 ROLE 부여
GRANT sales_team TO kim;
권한은 다음과 같은 계층 구조로 나뉘며, 범위가 넓은 것부터 좁은 것으로 생각하면 된다.
(최상위) DATABASE 수준 권한
└─ SCHEMA 수준 권한
└─ OBJECT 수준 권한 (TABLE, VIEW, FUNCTION 등)
└─ COLUMN 수준 권한
| 수준 | 예시 | 설명 |
|---|---|---|
| 데이터베이스 | GRANT CREATE ON DATABASE mydb TO dev_user; | DB 내 객체 생성 허용 |
| 스키마 | GRANT USAGE ON SCHEMA hr TO hr_analyst; | 스키마 접근 허용 |
| 테이블 | GRANT SELECT ON employees TO analyst; | 테이블 조회 허용 |
| 컬럼 | GRANT SELECT (name, salary) ON employees TO hr_manager; | 특정 컬럼만 조회 허용 |
-- 신규 사용자에게 읽기 전용 권한 부여
GRANT SELECT ON products TO new_user;
-- DBA가 특정 부서 사람에게 주문 관련 테이블의 수정 권한 부여
GRANT INSERT, UPDATE, DELETE ON orders TO sales_team;
-- 권한 회수 - 퇴사자 처리
REVOKE ALL ON *.* FROM byebye;
| 전략 | 설명 |
|---|---|
| 최소 권한 원칙 | 사용자가 필요한 권한만 가지도록 최소한의 권한만 부여 |
| ROLE 기반 관리 | 비슷한 권한을 ROLE로 묶고, 사용자에게 ROLE 할당 |
| 정기적 검토 | 권한이 오래된 사용자는 제거하거나 갱신 |
| 감사(Audit) 로그 | 누가 어떤 권한을 가지고 있는지 추적 가능하도록 로그 관리 |
COMMMIT없이도 즉시 적용된다.WITH GRANT OPTION은 권한이 무분별하게 퍼질 수 있다.