사용자는 데이터베이스 연산을 하려면 연산에 필요한 권한을 가지고 있어야 하며, 만약 권한이 없는 연산은 시스템에 의하여 수행이 거부된다.
DBA는 모든 권한을 가지고 있으며, 특정 사용자에게 특정 권한을 부여할 수 있다.
데이터베이스 시스템에 관련이 있는 권한은 여러 종류가 있다.
데이터베이스 인스턴스에 대한 권한으로는 읽기 권한, 입력 권한, 갱신 권한, 삭제 권한이 있으며,
데이터베이스 스키마에 대한 권한으로는 색인 생성/삭제 권한, 테이블 생성 권한, 테이블 속성 변경 권한, 테이블 삭제 권한이 있다.
SQL 언어가 지원하는 권한들이다.
select
/insert
/update
/delete
references
는 외래키를 선언할 수 있는 권한
usage
는 도메인을 사용할 수 있는 권한
all privileges
는 모든 권한 부여
Grant 문장은 권한을 부여하는 기능이다. 구문은 다음과 같다:
Grant <privilege> on <테이블명> to <user list> [with grant option]
<user list>
는 사용자 아이디의 나열
이나 role
(후에 나옴), public
을 사용할 수 있다.
public
은 키워드로서 모든 사용자를 의미한다. Grant 문장에 [with grant option]
을 사용하면, 권한을 받는 사용자가 부여 받은 권한을 다른 사용자에게 부여할 수 있다.(내가 받은걸 딴 애들한테도 물려줄 수 있다.)
Grant select on professor to U1, U2, U3;
Grant select on professor to U4 with grant option;
Grant references (deptName) on department to Lee;
Revoke 문장은 부여한 권한을 철회(회수)하는 기능이다. 구문은 다음과 같다:
Revoke <privilege> on <테이블명> from <user list> [restrict | cascade];
Revoke select on professor from U1, U2, U3;
1) 만약에 사용자 U1이 U2에게 특정 권한을 주었고, 또 U2가 동일 권한을 사용자 U3에게 부여했을 때, 이 경우 사용자 U1이 U2에게 권한 취소를 한다면 어떻게 될까?
cascade
옵션은 권한 취소 시에 취소되는 권한으로 인하여 함께 취소가 되어야 하는 권한이 있으면 그 권한도 함께 취소하는 것이며,
restrict
옵션은 취소하려는 권한으로 인하여 다른 권한이 함께 취소되어야 하는 경우에는 권한 취소 연산 자체가 수행되지 않는다.
restrict 옵션은 사용자가 본의 아니게 취소하는 권한을 방지하는 기능을 제공한다. 사용자가 restrict 옵션을 사용하여 revoke 문장을 실행하면, 사용자가 인지하지 못했던 권한에 대한 취소를 방지할 수 있다.
구문은 다음과 같다:
Revoke select on professor from U1, U2, U3 cascade;
Revoke select on professor from U1, U2, U3 restrict;
2) 만약에 사용자 U1이 U2에게 특정권한을 주었는데, U3가 U2에게 동일권한을 부여하였다면 사용자 U1이 Revoke select on professor from U2;
라는 구문을 입력했을 때 U2의 select권한은 없어질까?
Revoke select on professor from U2;
를 입력해야 U2는 professor에대한 select권한이 완전히 없어지게 된다.3) 권한 취소를 받는 사용자가 public이면 모든 사용자에게서 권한을 취소하는 것이다. 그러나 만약 다른 사용자로부터 동일 권한을 이미 받았으면 그 권한까지 취소되지 않는다.
grant select on professor to public;
// 모든사용자에게 권한부여grant select on professor to U2;
// U2에게만 권한부여grant select on professor to U2;
// U2에게만 권한부여revoke select on professor from public;
// 모든 사용자 권한 철회“grant option" 권한도 취소가 가능하다.
Revoke grant option for select on professor from U5;
grant option for select
(select 물려주기권한)을 철회DBS는 임의의 사용자로부터 임의의 다른 사용자로 누가 권한을 부여하고 누가 권한을 부여받았는지에 대한 도식화를 사용한다.
Node는 사용자를 나타내고, 그래프의 root는 DBA이어야 하며, Edge는 권한 부여를 나타낸다.
모든 권한은 DBA로부터 나오게 되므로, 그래프의 모든 Edge는 DBA 로부터 접근이 가능하여야 한다 (즉, 길(path)이 있어야 한다).
상기는 professor 테이블 갱신에 대한 권한 그래프이다.
만약 DBA가 U2의 권한을 취소하면, U2가 U3, U4에게 부여한 권한이 함께 취소되어야 한다.
이 권한 그래프를 만드는 구문은 다음과 같다.
DBA > Grant select on professor to U7 with grant option;
U7 > Grant select on professor to U8 with grant option;
U8 > Grant select on professor to U7;
상기의 그래프에서 "DBA → U7" 에지가 취소되면, "U7 → U8" 및 "U8 → U7" 에지도 함께 취소되어야 한다. 그렇게 하기 위해서는 다음과 같이 구문을 작성하여야 한다.
DBA > Revoke select on professor from U7 cascade;
참고적으로 아래와 같이 restricted 옵션으로 권한 취소 연산을 수행하면 실행 오류가 발생한다.
DBA > Revoke select on professor from U7 restricted;
뷰는 일반 테이블과 마찬가지로 권한 부여 대상이어서 뷰에 대한 검색/삭제/삽입/갱신 권한 등이 존재한다. 그러나 뷰에 대한 권한은 일반 테이블 권한과 다르게 적용되므로 주의가 필요하다.
베이스 테이블에 대한 최소한 SELECT 권한이 있어야 뷰 생성이 가능하며, 생성된 뷰에 대해서도 베이스 테이블에 대한 권한을 능가하는 권한을 가질 수 없다.
뷰 생성자는 resource 권한이 필요 없다. 일반 테이블을 생성하는 것이 아니기 때문이다.
일반 테이블 생성자는 그 테이블에 대한 모든 권한을 가지는 반면에,
뷰 생성자는 뷰에 대한 모든 권한을 가지지 못한다.
베이스 테이블에 대한 select 권한이 있어야 뷰 생성이 가능하므로 뷰 생성자는 뷰에 대한 select 권한은 가지게 되나, 그 이상의 권한은 베이스 테이블에 대한 권한에 의존적이다.
다만 사용자가 베이스 테이블에 갱신 권한을 이미 가지고 있으면 뷰에 대한 갱신 권한도 당연히 가진다.
Create view myTeach as
select name, title
from professor, teaches, course
where teaches.pID=professor.pID and course.cID=teaches.cID
and semester=‘Fall’ and year=2015;
/* 위 구문은 professor, teaches, course에 대해 select 권한만을 가지고 있는
조교가 아닌 어떤 사용자가 만든 구문이다. */
Solution: 교수가 2015년 가을 학기에 강의하는 과목은 접근을 하고 교수 봉급을 접근하지 못하게 하려면, 상기와 같이 myTeach 뷰를 생성하여 조교에게 myTeach뷰에 대한 읽기 권한을 부여해 주면 된다.
조교가 myTeach뷰를 보려고(select) 할 때 조교는 professor테이블에 대한 select권한이 없으므로 view에 대한 select도 불가능하지 않을까?? 왜냐면 view는 Base table에 기반해서 만들어졌으니까,,,
조교는 다음 쿼리에 대한 결과를 볼 권한이 있다 ㅎㅎ
select * from myTeach;
데이터베이스 시스템은 상기 뷰에 대한 질의가 들어오면 뷰 정의를 이용하여 뷰를 확장하게 되고, 이 경우 확장된 뷰는 베이스 테이블 professor, course, teaches를 가진다. 사용자는 베이스 테이블에 대한 권한이 전혀 없으므로, 뷰에 대한 접근 권한 검사는 뷰가 확장되기 전에 뷰에 대하여 수행하여야 한다.
■ 롤
롤은 사용자의 집합이다. 사용자 다수에게 동일한 권한을 부여하는 경우에, 다수 사용자를 동일한 롤로 정의한 후에, 롤에 권한을 부여하면, 롤에 속하는 모든 사용자에게 권한이 부여된다.
롤을 다른 롤에게도 부여할 수 있다. 이 기능을 이용하면, 사용자를 계층적으로 관리하는 것이 가능하다. 롤은 사용자 관리에 아주 유효한 기능이다.
■ 롤 예제
롤 예제이며, teller 롤을 manager 롤에게 부여하는 것은 teller가 가진 모든 권한을 manager에게 부여하는 것이다. 그 결과 manager 권한은 teller 권한을 다 가지게 된다. teller와 manager에게 궁극적으로 사용자를 부여함으로써 사용자를 계층적으로 관리하는 효과이다.
■ SQL 권한 관리의 제약
SQL 데이타베이스 시스템에서 터플 수준에서의 권한 관리는 불가능하다. 다만 갱신 연산인 경우 속성에 대한 권한 관리는 가능하다. 그 결과, 이름, 성적 등이 기록되어 있는 학생 테이블에 대하여 특정 학생이 본인 성적만을 접근하게 하는 기능을 DBMS가 제공하지 않는다.
데이터베이스 응용은 웹 환경에서 개발이 주로 이루어진다. 이 경우, 데이터베이스 시스템을 접근하는 응용 프로그램이 가지는 데이터베이스 시스템 총 사용자 아이디가 하나 일 수도 있다. 이 경우에는 데이터베이스 시스템 권한 관리를 사용하지 않고 응용 프로그램에서 사용자 관리 및 권한 관리를 수행하게 된다. 응용 프로그램에서는 여러 형태의 데이터 접근 제어가 가능하므로, 예를 들면 특정 학생이 본인 성적만을 접근하게 하는 기능 구현이 가능하다. 데이터 접근 제어를 응용 프로그램에서 구현하는 방식의 장단점은 상기와 같다.