DCL(Data Control Language)은 데이터베이스 내에서 유저와 권한을 관리하는 명령어들을 포함한다.
DCL은 유저를 생성하고 이들에게 데이터베이스 오브젝트에 대한 접근 권한을 부여하는 명령어들이다. DCL 명령어를 통해 데이터베이스의 보안을 강화하고 데이터의 손실을 예방할 수 있다.
데이터베이스를 공유할 필요가 있을 때 새로운 유저를 생성하고, 이 유저에게 필요한 권한만 부여하여 데이터 손실을 방지할 수 있다. 예를 들어, 회원제 웹사이트에서는 유저가 가입하고 로그인하여 서비스를 이용하며, 특정 컨텐츠에 접근하기 위해서는 추가적인 권한이 필요하다.
Oracle 데이터 베이스는 몇 가지 기본 유저를 제공한다.
Oracle과 SQL Server의 사용자 아키텍처는 다르다. Oracle에서는 유저를 통해 데이터베이스에 접속하며, 해당 유저에게 스키마와 오브젝트 생성 권한을 부여합니다. 반면에 SQL Server에서는 인스턴스에 접속하기 위해 로그인 계정을 생성하고, 로그인과 유저를 매핑하여 작업을 수행한다.
SQL Server 로그인 방식은 두 가지이다.
예시로, SQL Server에서는 SCOTT이라는 LOGIN 이름으로 인스턴스 INST1에 접속하여, SCOTT이라는 유저를 통해 PRODUCT 스키마의 ITEM 테이블에 접근할 수 있다.
데이터베이스에서 유저를 생성하고 권한을 부여하는 과정은 데이터 보안과 관리에 있어서 중요한 부분이다. 유저가 데이터베이스에 접속하여 다양한 작업을 수행하려면 필요한 권한이 부여되어야 한다.
테이블 생성, 뷰 생성, 세션 생성 등 다양한 작업을 수행할 수 있는 권한을 부여하는 것유저가 시스템 권한을 가지지 않으면, DDL 문장(CREATE, ALTER, DROP, RENAME 등)을 실행할 수 없다. 이러한 권한은 약 100개 이상 있으며, 일반적으로 롤(ROLE)을 이용해 관리한다.
Oracle에서 유저를 생성하고 권한을 부여하는 과정은 다음과 같다.
CREATE USER PJS IDENTIFIED BY KOREA7;
-- 오류 발생: ERROR: 권한이 불충분하다
-- 이유: SCOTT 유저에게 유저 생성 권한(CREATE USER)이 부여되지 않았기 때문이다.
GRANT CREATE USER TO SCOTT;
-- 권한 부여 후 SCOTT 유저로 다시 접속하여 유저 생성
CREATE USER PJS IDENTIFIED BY KOREA7;
-- 성공: 사용자가 생성되었다
CONN PJS/KOREA7;
-- 오류 발생: ERROR: 사용자 PJS는 CREATE SESSION 권한을 가지고 있지 않음
-- 이유: 유저가 로그인하려면 CREATE SESSION 권한이 필요하다.
GRANT CREATE SESSION TO PJS;
-- 권한 부여 후 PJS 유저로 다시 접속:
CONN PJS/KOREA7;
-- 성공: PJS 유저로 로그인 가능
CREATE TABLE MENU ( MENU_SEQ NUMBER NOT NULL, TITLE VARCHAR2(10) );
-- 오류 발생: ERROR: 권한이 불충분하다.
-- 이유: 테이블 생성 권한(CREATE TABLE)이 부족하기 때문이다.
GRANT CREATE TABLE TO PJS;
-- 권한 부여 후 PJS 유저로 다시 접속하여 테이블 생성
CREATE TABLE MENU ( MENU_SEQ NUMBER NOT NULL, TITLE VARCHAR2(10) );
-- 성공: 테이블이 생성되었다.
SQL Server에서는 유저를 생성하기 전 로그인을 생성해야 한다.
CREATE LOGIN PJS WITH PASSWORD='KOREA7', DEFAULT_DATABASE=AdventureWorks;
-- 성공: 로그인이 생성되었다
USE AdventureWorks;
GO
CREATE USER PJS FOR LOGIN PJS WITH DEFAULT_SCHEMA = dbo;
-- 성공: 유저가 생성되었다.
-- Oracle과 동일하게 CREATE SESSION 권한이 필요합니다.
GRANT CREATE TABLE TO PJS;
GRANT CONTROL ON SCHEMA::dbo TO PJS;
-- 권한 부여 후 PJS 유저로 다시 접속하여 테이블 생성
CREATE TABLE MENU ( MENU_SEQ INT NOT NULL, TITLE VARCHAR(10) );
-- 성공: 테이블이 생성되었다.
특정 유저가 소유한 객체(OBJECT)에 대해 다른 유저가 접근하거나 조작하려면 필요한 권한을 소유자로부터 부여받아야 한다. 오브젝트 권한은 테이블, 뷰 등 특정 오브젝트에 대한 SELECT, INSERT, DELETE, UPDATE 작업 명령어를 의미한다.


-- Oracle
CONN SCOTT/TIGER
SELECT * FROM PJS.MENU;
-- SQL Server
SCOTT로 로그인
SELECT * FROM dbo.MENU;
-- 오류 발생: 권한이 부족하여 테이블 조회 불가.
-- Oracle
CONN PJS/KOREA7
INSERT INTO MENU VALUES (1, '화이팅');
COMMIT;
GRANT SELECT ON MENU TO SCOTT;
-- SQL Server
PJS로 로그인
INSERT INTO MENU VALUES (1, '화이팅');
GRANT SELECT ON MENU TO SCOTT;
-- 성공: SCOTT 유저에게 MENU 테이블 SELECT 권한 부여됨.
-- Oracle
CONN SCOTT/TIGER
SELECT * FROM PJS.MENU;
-- SQL Server
SCOTT로 로그인
SELECT * FROM dbo.MENU;
-- 성공: MENU 테이블 조회 가능.
-- Oracle
CONN SCOTT/TIGER
UPDATE PJS.MENU SET TITLE = '코리아' WHERE MENU_SEQ = 1;
-- SQL Server
SCOTT로 로그인
UPDATE dbo.MENU SET TITLE = '코리아' WHERE MENU_SEQ = 1;
-- 오류 발생: 권한 부족으로 UPDATE 불가.
-- Oracle
CONN PJS/KOREA7
GRANT UPDATE ON MENU TO SCOTT;
-- SQL Server
PJS로 로그인
GRANT UPDATE ON dbo.MENU TO SCOTT;
-- 성공: SCOTT 유저에게 MENU 테이블 UPDATE 권한 부여됨.
-- Oracle
CONN SCOTT/TIGER
UPDATE PJS.MENU SET TITLE = '코리아' WHERE MENU_SEQ = 1;
-- SQL Server
SCOTT로 로그인
UPDATE dbo.MENU SET TITLE = '코리아' WHERE MENU_SEQ = 1;
-- 성공: MENU 테이블 업데이트 가능.
데이터베이스에서 유저에게 필요한 권한을 효율적으로 관리하기 위해 Role을 사용하는 방법을 설명하겠다. Role을 통해 권한을 중앙에서 관리하고, 여러 유저에게 필요한 권한을 손쉽게 부여할 수 있다.
Role은 여러 권한을 묶어서 관리할 수 있는 그룹이다. 데이터베이스 관리자는 Role을 생성하고, Role에 각종 권한을 부여한 후, Role을 유저에게 할당할 수 있다. 이를 통해 개별 유저에게 권한을 직접 부여하는 대신, Role을 통해 일괄적으로 권한을 부여하고 관리할 수 있다.

위 그림은 권한을 직접 유저에게 할당하는 것이며, 오른쪽 그림은 Role에 권한을 부여한 후 Role을 유저에게 부여하는 것을 나타낸다.
CONN SYSTEM/MANAGER
REVOKE CREATE SESSION, CREATE TABLE FROM JISUNG;
-- 권한 취소 후 JISUNG 유저는 접속할 수 없습니다.
CONN SYSTEM/MANAGER
CREATE ROLE LOGIN_TABLE;
GRANT CREATE SESSION, CREATE TABLE TO LOGIN_TABLE;
GRANT LOGIN_TABLE TO JISUNG;
-- LOGIN_TABLE Role 생성
-- Role에 CREATE SESSION 및 CREATE TABLE 권한 부여
-- Role을 JISUNG 유저에게 부여
CONN JISUNG/KOREA7
CREATE TABLE MENU2 ( MENU_SEQ NUMBER NOT NULL, TITLE VARCHAR2(10) );
sa로 로그인
REVOKE CREATE TABLE FROM PJS;
-- 권한 취소 후 PJS 유저는 테이블을 생성할 수 없다.
sa로 로그인
CREATE ROLE LOGIN_TABLE;
GRANT CREATE TABLE TO LOGIN_TABLE;
GRANT LOGIN_TABLE TO PJS;
-- LOGIN_TABLE Role 생성
-- Role에 CREATE TABLE 권한 부여
-- Role을 PJS 유저에게 부여
-- PJS로 로그인
CREATE TABLE MENU2 ( MENU_SEQ INT NOT NULL, TITLE VARCHAR(10) );
Oracle에서는 기본적으로 몇 가지 Role을 제공한다. 그 중 가장 많이 사용하는 Role은 CONNECT와 RESOURCE이다.

SQL Server에서는 Role을 자주 사용하지 않고, 기본적으로 제공되는 서버 수준 역할과 데이터베이스 수준 역할을 사용한다.


SQL Server에서는 서버 수준 역할을 통해 인스턴스 수준의 작업 권한을, 데이터베이스 수준 역할을 통해 데이터베이스 내의 권한을 관리한다.
이와 같이 Role을 이용하여 유저와 권한을 효율적으로 관리할 수 있다.