무결성(integrity)
: 저장된 데이터가 실제 세계에 존재하는 정보들을 모순 없이 반영하는 성질.
= 갖추어야 할 제약 조건을 항상 만족하도록 보장하는 성질.
= 무결성 제약(constraint) 또는 무결성 규칙(rule)
Q. 데이터 베이스에서 이러한 무결성 제약 조건들을 만족시키려면 어떻게 해야할까?
A1. 데이터 삽입, 삭제, 수정시 수동으로 검증한다.
-> 데이터 양이 방대하거나 변경 빈도가 높을 경우 거의 불가능하다.
A2. DBMS가 자동으로 보장해준다.
대략적인 무결성 제약 유형
: 관계형 데이터 모델의 정의로부터 규정된 제약들.
(기본키와 외래키를 정의할 때 반드시 지켜져야 할 규칙으로부터 시작)
: 테이블에서 레코드들은 반드시 유일하게 식별될 수 있어야 한다.
정의 : 기본키는 널 값을 가질 수 없으며 기본키의 값이 동일한 레코드가 하나의 테이블에 동시에 두 개 이상 존재할 수 없다.
사용자가 기본키를 정의하여 테이블을 생성하면 기본키 무결성 제약은 DBMS에서 자동적으로 검증된다. (제약을 위반하는 레코드가 입력되면 자동적으로 거부됨)
: 한 테이블의 레코드가 다른 테이블을 참조할 때, 참조되는 테이블에 해당 레코드가 반드시 존재하거나, 참조할 레코드가 없는 경우 널 값을 가져야 한다는 제약이다. (== 외래키 조건)
실제 존재하지 않는 잘못된 값이 저장되지 않도록 보정하는 수단.
참조 무결성 제약은 삽입, 삭제, 수정 등의 연산에 의해 위배될 수 있는데, 위배 시 해당 연산을 DBMS에서 실행 거부한다.
사용 : 특정 필드에 대해서 널 값의 입력을 허용하지 않아야 하는 경우.
ex. 주민등록번호처럼 반드시 존재해야 하는 값.
create table student
(
stu_id varchar2(10),
resident_id varchar2(14) not null
)
not null로 지정된 필드에 널 값이 입력되면 해당 연산을 거부한다.
기본키로 정의된 필드는 명시적으로 not null 조건을 굳이 설정하지 않아도 된다. (내부적으로 허용하지 않기 때문)
: 테이블 내에서 중복된 값을 갖지 않고 유일하게 식별되도록 하는 제약 조건.
기본키의 개념과 유사
결국 unique조건을 부여할 수 있는 필드들은 해당 테이블의 후보키를 의미한다.
널 값의 입력을 허용한다.
두 개 이상의 필드에 동시 설정 가능하다.
constraint <제약식명> unique (<필드리스트>)
ex1. 기본적인 부여 : resident_id의 중복을 허용하지 않음
create table student
(
stu_id varchar2(10),
resident_id varchar2(14),
constraint uc_rid unique (resident_id)
)
ex2. 간단하게 표현 가능
create table student
(
stu_id varchar2(10),
resident_id varchar2(14) unique
)
ex3. 두 개 이상의 필드
: family_name과 given_name이 동시에 중복되는 경우를 허용하지 않음.
create table student
(
stu_id varchar2(10),
resident_id varchar2(14),
family_name varchar2(10),
given_name varchar2(10),
constraint uc_rid unique (family_name, given_name)
)
사용 : 도메인 제약 이외에도 좀 더 세부적으로 허용할 값의 범위를 지정할 때.
constraint <제약식명> check (<조건식>)
// 조건식에는 앞서 말한 필드에 대한 더 세부적인 조건이 들어간다.
// 간단한 표현도 가능하다.
ex. year는 1부터 4까지의 정수이고, address는 {'서울','부산'} 하나여야 한다는 조건이 추가된 student 테이블
create table student
(
stu_id varchra2(10),
year int,
address varchar2(10),
constraint chk1 check (year >= 1 and
year <= 4 and
address in ('서울', '부산'))
사용 : 레코드를 삽입할 때 필드에 대한 값이 정해지지 않았을 경우 사전에 정해놓은 값으로 입력하도록 지정할 때.
ex1. year의 default값을 1로 지정
create table student
(
year int default 1
)
ex2. alter table문을 이용할 경우
alter table student
alter column year set default 1
//default 해제는 alter column year drop default
+) alter column~ 문법은 대부분의 DBMS에서 지원하지만
오라클에서는 지원하지 않는다.
오라클에서는
modify (year int default 1)
modify (year int deault null) 을 사용해야 한다.
장점
잘못된 데이터들이 존재할 가능성을 원천적으로 막을 강력한 수단.
단점
예외적인 데이터가 발생했을 때 처리하기 까다로움.
무결성 제약을 검사하는 DBMS의 전체적인 성능저하 가능성.
데이터 자체의 유효성을 검증하는 것이 아닌 제약 조건일 경우 주장이나 트리거와 같은 명령을 통해 무결성을 보장할 수 있다.
create assertion <주장이름> check <조건식>
ex. "교수는 한 학기에 3강좌 이상을 강의할 수 없다"
create assertion assert1 check
(not exists (select count(*)
from class
group by year, semester, prof_id) > 3)
)
// not exists는 검색결과에 최소한 하나 이상의 레코드가 존재하는지의 여부를 표현할 수 있다. (하나라도 존재하면 거짓)
주장 명령문 실행 시 데이터베이스는 현재 저장된 데이터들에 대해 해당 조건이 만족되는지 검증한다.
이후 발생되는 데이터에 대해서도 주장의 조건이 만족되는지 감시하는 역할도 한다.
주장의 조건이 복잡할 경우 시스템 부하의 원인이 된다.
앞서 소개한 무결성 제약 방법을 사용하지 않을 땐,
응용 프로그램에서 직접 무결성을 보장하는 코드를 삽입하는 방법이 있다.
DBMS에서 제공하는 방법을 사용하는 것이 가장 간단하고 편리한 방법이지만, DBMS만으로 제어가 불가능한 복잡한 제약을 구현할 때 사용.
응용 프로그램에서 직접 검증함으로써 데이터베이스에 집중된 부하를 분산하는 효과를 얻을 수도 있다.
이론적으로 100% 완벽한 보안은 불가능하기 때문에, 데이터의 중요도에 따라 다양한 수준에서의 보안 정책이 이루어져야 한다.
사용자의 권한 제어는 가장 낮은 수준의 보안이지만, 반대로 가장 핵심적이고 기초적안 보안 방법이다.
데이터베이스의 사용 권한이란?
: 사용자가 특정 객체에 대해 특정 연상을 실행할 수 있는 권리.
(특정 객체 : 테이블, 뷰, 필드 등)
데이터 접근 관련 연산 (DML)
: 데이터룰 변경 또는 참조하는 모든 행위.
ex. SQL의 select, insert, delete, update연산
스키마 관련 연산 (DDL)
: 스키마를 수정하는 연산.
ex. SQL의 create table, alter table, drop table, create index 등
데이터베이스 관리자
: DBMS내의 모든 객체에 대해 모든 종류의 권한을 갖고, 일반 사용자에게 일부 또는 모든 권한을 부여하거나 회수할 수 있다.
객체 소유자(owner)
: 특정 사용자가 객체를 생성했으면 그 사용자가 해당 객체의 소유자가 된다. 소유자는 해당 객체에 대해 DBA와 같이 모든 권한을 갖는다.
기타 사용자
: 기본적으로 객체에 대한 일체의 사용권한이 없다.
DBA나 객체 소유자로부터 권한을 부여받을 수 있다.
+) 실제 권한이 부여되는 연산의 종류는 매우 다양하며 DBMS마다 별도로 정의.
: SQL의 권한 부여 명령문.
grant <권한리스트> on <객체명> to <사용자리스트>
<권한리스트> : 권한의 종류에 대한 리스트
; 한 개 이상의 권한을 포함할 수 있다.
ex. select, insert, delete, update, references
<객체명> : 대상이 되는 객체
<사용자리스트> : 권한을 부여받는 사용자들의 리스트
= <사용자리스트>에게 <객체명>에 대한 <권한리스트>를 실행할 권리를 부여.
ex1. 기본형
grant select, delete on student to kim
ex2. 특정 필드 제한 허용
grant select (stu_id) on student to kim
select, update는 특별히 테이블 내의 특정 필드에 대해서만 연산을 허용할 수 있다. 위 코드는 stu_id에 대해서만 select연산을 허용한다는 의미.
ex3. references
grant references (dept_id) on department to kim
전제상황 :
department (lee소유)
kim이 department의 dept_id를 참조하는 student테이블을 만들고자 함.
이 때 kim은 department에 대한 권한이 없으므로 외래키 정의가 불가함.
그래서 lee는 kim에게 department를 참조할 수 있는 권한을 주고자 함.
reference는 lee가 kim에게 department 참조 권한을 줄 때 사용가능.
ex4. public
grant select on student to public
모든 사용자에게 <권한리스트>의 권한 부여.
ex5. all privileges
grant all privileges on student to lee
모든 종류의 권한을 하나의 명령으로 부여하는 키워드.
+) grant문은 데이터 접근에 관련한 권한을 제어할 수 있음을 알았다.
일부 DBMS들은 스키마 관련 연산도 grant문으로 부여할 수 있다.
(뒤에 나오는 오라클에서의 사용자 권한 제어)
: 부여받은 권한을 다른 사용자에게 전파할 수 있는 옵션.
(GRANT는 부여 받은 명령을 실행만 할 수 있는 자격을 얻는다)
ex. 기본형
grant select on student to kim with grant option
// select권한을 부여받은 kim은
grant select on student to chang
// chang에게 select권한을 부여할 수 있다.
// chang은 다른 사용자에게 권한 부여를 할 수 없다.
: 다른 사용자에게 부여한 권한을 회수하는 명령. (revoke : 취소)
revoke <권한리스트> on <객체명> from <사용자리스트>
: 권한에 따른 사용자 그룹.
; 원칙적으로 데이터베이스 관리자만이 생성할 수 있다.
권한별로 사용자 그룹을 만들어 그룹에 권한을 부여하는 방법은 권한 부여에서 단순히 반복되는 작업을 줄여준다.
create role <롤이름>
ex. create role employee
grant <롤리스트> to <사용자리스트>
ex. grant employee, manager to park
// <롤리스트>에는 하나 이상의 롤들이 사용될 수 있다. 즉, 사용자는 하나 이상의 롤에 배정 될 수 있다.
ex. grant select on student to employee
revoke <롤리스트> from <사용자리스트>
ex. revoke manager from choi
drop role manager
: 필드뿐만 아니라 레코드 일부에 대해서도 접근제어가 가능해져 더 강력한 보안이 가능하다.
; 특정 테이블에서 일부 필드 혹은 일부 레코드에 대해서만 접근을 허용할 경우 이 부분들을 뷰로 정의하고, 그 다음 사용자에게 정의된 뷰에 대해 접근 권한을 부여하고 실제 테이블에 대한 접근을 차단한다면 사용자에게 감추고 싶은 부분에 대한 보안이 자연스럽게 구현된다.
+) 뷰를 사용하지 않는 단순한 grant문만으로는 필드에 대해서만 접근제어 가능.
오라클은 기본 무결성 제약과 테이블의 무결성 제약 기능을 모두 제공한다.
department 테이블을 참조하는 외래키가 정의된 student테이블과 department 테이블을 생성할 때 생성 순서와 레코드 삽입 순서를 주의해야한다. (둘 다 department 먼저)
기본키 무결성 제약
: 중복되는 레코드 삽입 거부
참조 무결성 제약
: 참조하는 테이블의 기본키에 존재하지 않는 외래키 삽입 거부.
; 이 외에도 참조되는 레코드나 테이블의 삭제 거부.
: 시스템 전반에 대한 접근 권한을 제어하는 기능을 갖고 있다.
크게 시스템 권한 / 객체 권한으로 나뉜다.
시스템 권한 (system privileges)
: 사용자의 생성, 테이블이나 테이블스페이스의 생성 등과 같이 주로 시스템의 자원을 관리할 수 있는 권한.
; 오라클에서는 그 종류가 100개가 넘는다.
; 기본적으로 DBA 계정인 sys, system은 모든 시스템 권한을 갖고있다.
ex. create user/drop user, create session(로그인 권한), create table/drop any table/select any table, create view/drop any view, create tablespace/drop tablespace, create role/drop any role
객체 권한 (object privileges)
: 해당 객체에 대해 select, insert, delete, update등과 같은 DML을 실행할 수 있는 권한.
+) 오라클에서 다른 사용자가 소유한 테이블에 대해 테이블 이름을 명시할 때는 '소유자명.테이블명'과 같이 테이블 이름 앞에 소유자명까지 기입해야 한다.
WITH GRANT OPTION
REVOKE
: 권한을 회수하고 select를 하게되면 '테이블 또는 뷰가 존재하지 않습니다'라는 에러 메시지가 뜨는데 이는 실제로 존재하지 않는다는 것이 아니라 사용자에게 테이블의 존재를 알리지 않는 것을 의미한다.
+) 오라클의 with admin option
: 시스템 권한을 전파할 때 사용한다. (with grant option은 객체 권한 전파시 사용)
일반적으로 사용자를 생성하면 특별한 제한이 없는 한 connect와 resource롤을 부여한다.