06.윈도우 함수
3. Role 을 이용한 권한 부여
유저를 생성하면 기본적으로 CREATE SESSION, CREATE TABLE, CREATE PROCEDURE 등 많은 권한을 부여해야 한다. 데이터베이스 관리자는 유저가 생성될 때마다 각각의 권한들을 유저에게 부 여하는 작업을 수행해야 하며 간혹 권한을 빠뜨릴 수도 있으므로 각 유저별로 어떤 권한이 부여되 었는지를 관리해야 한다. 하지만 관리해야 할 유저가 점점 늘어나고 자주 변경되는 상황에서는 매 우 번거로운 작업이 될 것이다.
이와 같은 문제를 줄이기 위하여 많은 데이터베이스에서 유저들과 권한들 사이에서 중개 역할을 하 는 ROLE 을 제공한다. 데이터베이스 관리자는 ROLE 을 생성하고, ROLE 에 각종 권한들을 부여한 후 ROLE 을 다른 ROLE 이나 유저에게 부여할 수 있다. 또한 ROLE 에 포함되어 있는 권한들이 필 요한 유저에게는 해당 ROLE 만을 부여함으로써 빠르고 정확하게 필요한 권한을 부여할 수 있게 된다. [그림 Ⅱ-2-17]에서는 유저들과 권한들 사이 간 ROLE 의 역할을 보여 주고 있다. 왼쪽 그림 은 권한을 직접 유저에게 할당할 때를 나타내는 것이며, 오른쪽 그림은 ROLE 에 권한을 부여한 후 ROLE 을 유저들에게 부여하는 것을 나타내고 있다.
ROLE 에는 시스템 권한과 오브젝트 권한을 모두 부여할 수 있으며, ROLE 은 유저에게 직접 부여될 수도 있고, 다른 ROLE 에 포함하여 유저에게 부여될 수도 있다.
[예제] JISUNG 유저에게 CREATE SESSION 과 CREATE TABLE 권한을 가진 ROLE 을 생성한 후 ROLE 을 이용하여 다시 권한을 할당한다. 권한을 취소할 때는 REVOKE 를 사용한다.
[예제 및 실행 결과] Oracle CONN SYSTEM/MANAGER 연결되었다. REVOKE CREATE SESSION, CREATE TABLE FROM JISUNG; 권한이 취소되었다. CONN JISUNG/KOREA7 ERROR: 사용자 JISUNG은 CREATE SESSION 권한을 가지고 있지 않음. 로그온이 거절되었다.
[예제 및 실행 결과] SQL Server sa로 로그인한다. REVOKE CREATE TABLE FROM PJS; 권한이 취소되었 다. PJS로 로그인한다. CREATE TABLE MENU ( MENU_SEQ INT NOT NULL, TITLE VARCHAR(10) ); 데이 터베이스 ‘AdventureWorks'에서 CREATE TABLE사용 권한이 거부되었다.
[예제] 이제 LOGIN_TABLE 이라는 ROLE 을 만들고, 이 ROLE 을 이용하여 JISUNG 유저에게 권한 을 부여한다.
[예제 및 실행 결과] Oracle CONN SYSTEM/MANAGER 연결되었다. CREATE ROLE LOGIN_TABLE; 롤이 생 성되었다. GRANT CREATE SESSION, CREATE TABLE TO LOGIN_TABLE; 권한이 부여되었다. GRANT LOGIN_TABLE TO JISUNG; 권한이 부여되었다. CONN JISUNG/KOREA7 연결되었다. CREATE TABLE MENU2( MENU_SEQ NUMBER NOT NULL, TITLE VARCHAR2(10)); 테이블이 생성되었다.
이와 같이 ROLE 을 만들어 사용하는 것이 권한을 직접 부여하는 것보다 빠르고 안전하게 유저를 관리할 수 있는 방법이다. Oracle 에서는 기본적으로 몇 가지 ROLE 을 제공하고 있다. 그 중 가장 많이 사용하는 ROLE 은 CONNECT 와 RESOURCE 이다. 참조를 위해 [표 Ⅱ-2-11]은 CONNECT 와 RESOURCE ROLE 에 부여된 권한 목록을 정리한 것이다. CONNECT 는 CREATE SESSION 과 같은 로그인 권한이 포함되어 있고, RESOURCE 는 CREATE TABLE 과 같은 오브젝트의 생성 권한이 포 함되어 있다. 일반적으로 유저를 생성할 때 CONNECT 와 RESOURCE ROLE 을 사용하여 기본 권한 을 부여한다.
유저를 삭제하는 명령어는 DROP USER 이고, CASCADE 옵션을 주면 해당 유저가 생성한 오브젝트 를 먼저 삭제한 후 유저를 삭제한다.
[예제] 앞에서 MENU 라는 테이블을 생성했기 때문에 CASCADE 옵션을 사용하여 JISUNG 유저를 삭제한 후, 유저 재생성 및 기본적인 ROLE 을 부여한다.
[예제 및 실행 결과] Oracle CONN SYSTEM/MANAGER 연결되었다. DROP USER JISUNG CASCADE; 사용자 가 삭제되었다. ☞ JISUNG 유저가 만든 MENU 테이블도 같이 삭제되었다. CREATE USER JISUNG IDENTIFIED BY KOREA7; 사용자가 생성되었다. GRANT CONNECT, RESOURCE TO JISUNG; 권한이 부여되 었다. CONN JISUNG/KOREA7 연결되었다. CREATE TABLE MENU ( MENU_SEQ NUMBER NOT NULL, TITLE VARCHAR2(10)); 테이블이 생성되었다.
SQL Server 에서는 위와 같이 ROLE 을 생성하여 사용하기보다는 기본적으로 제공되는 ROLE 에 멤버로 참여하는 방식으로 사용한다. 특정 로그인이 멤버로 참여할 수 있는 서버 수준 역할(ROLE) 은 [표 Ⅱ-2-12]와 같다.
데이터베이스에 존재하는 유저에 대해서는 아래와 같은 데이터베이스 역할의 멤버로 참여할 수 있 다.
SQL Server 에서는 Oracle 과 같이 Role 을 자주 사용하지 않는다. 대신 위에서 언급한 서버 수준 역할 및 데이터베이스 수준 역할을 이용하여 로그인 및 사용자 권한을 제어한다. 인스턴스 수준의
작업이 필요한 경우 서버 수준 역할을 부여하고 그보다 작은 개념인 데이터베이스 수준의 권한이 필요한 경우 데이터베이스 수준의 역할을 부여하면 된다. 즉, 인스턴스 수준을 요구하는 로그인에 는 서버 수준 역할을, 데이터베이스 수준을 요구하는 사용자에게는 데이터베이스 수준 역할을 부여 한다.