- 무결성
- 무결성이란 데이터베이스에 저장된 데이터 값과 그 것이 표현하는 현실세계의 시제 값이 일치하는 정확성을 의미한다.
- 무결성 제약조건은 데이터베이스에 들어있는 데이터의 정확성을 보장하기 위해 부정확한 자료가 데이터베이스 내에 저장되는 것을 방지하기 위한 제약 조건을 말한다.
- 무결성 제약 조건은 데이터 베이스의 정확성과 일치성을 보장하기 위해 사용된다.
- 무결성의 종류에는 개체 무결성, 도메인 무결성, 참조 무결성, 사용자 정의 무결성 등이 있다.
- 개체 무결성
- 개체 무결성은 기본 테이블을 기본키를 구성하는 어떤 속성도 null 값을 가져서는 안된다.
- 기본키는 중복되어선 안된다.
- not null, primary, unique
- 도메인 무결성
- 도메인 무결성은 주어진 속성의 값이 정의된 도메인에 속한 값이어야 한다는 규정이다.
- check (조건)
- 아래는 예시이다.
create table ex(
semester varchar(10)
check (semester in ("봄", "여름", "가을", "겨울"))
);
- 참조 무결성
- 외래키의 값은 Null, 혹은 참조 릴레이션의 기본키 값과 동일해야 한다.
- foreign key(다른 테이블의 주키) references 다른_테이블
- on delete
- 참조 테이블에서 참조하는 튜플이 삭제될 때 행동이 명시되지 않으면 삭제 연산이 허용되지 않음
- on delete cascade
- 삭제 연산이 현 테이블 까지 파급되어 삭제된 튜플을 참조한느 튜플까지 모두 삭제된다.
- on delete set null
- 참조 키 값을 null로 변경
- 참조 키가 주키의 일부분을 경우 허용되지 않는다.
- on update
- 변경 연산시 행위가 정의되지 않으면 변경연산이 되지 않는다.
- 참조 당하는 튜플의 주키가 변경된다고 가정하자.
- on update cascade
- on update set null
- 사용자 정의 무결성
- 속성 값들이 사용자가 정의한 제약 조건을 만족해야함을 의미
- check, assertion, trigger를 통해 관리한다.
- assertion의 예시
create assertion myVerifyTotalCredit check
(not exists
(select pid
from professor
where ...
)
);
- 트리거
- 트리거는 데이터베이스가 무결성제약 관리를 위해 지원하는 기능이다.
- ECA 규칙으로 Event (사건) / Condition (조건) / Action (행동) 부문으로 구서오딘다.
- 데이터베이스 시스템에 어떤 사건이 발생하면 주어진 조건을 평가하여 조건이 만족되면 주어진 행동을 하는 규칙이다.
- 사건은 데이터베이스에 대한 변경 연산 (insert / delete / update 연산)을 의미한다.
- 트리거 생성
create [or replace] trigger 트리거명 동작시기 동작 on 테이블명
[referencing new | old as 테이블명]
[for each row [when 조건식]]
begin
트리거 body;
end;
- -
- 동작시기
- 트리거가 실행될 때를 지정, after 와 before가 있음
- after : 테이블이 변경된 후에 트리거가 실행됨
- before : 테이블이 변경되기 전에 트리거가 실행
- 동작
- 트리거가 발동되는 작업의 종류를 지정
- insert, delete, update가 있다.
- new | old
- new : 추가되거나 수정에 참여할 튜플들의 집합을 말함
- old : 수정되거나 삭제 전 대상이 되는 튜플들의 집합을 의미
- for each row : 각 튜플마다 트리거를 적용
- when : 튜플을 적용할 튜플들의 조건
Create trigger myCred after update of grade on takes
referencing new row as nrow
referencing old row as orow
for each row
when nrow.grade <> ’F’ and nrow.grade is not null
and (orow.grade = ’F’ or orow.grade is null)
begin atomic
Update student
set totalCredit = totalCredit +
(select credit
from course
where cID = nrow.cID)
where sID = nrow.sID;
end;