저장된 데이터의 의미적 정확성을 보장하기 위해서, 테이블을 정의할 때 데이터베이스 스키마의
한 부분으로서 무결성 제약조건을 명시해야 합니다. 테이블 정의와 별도로 데이터베이스의 무결성을
시행하는 메커니즘인 트리거와 주장을 알아보겠습니다.
제약조건이 트리거보다 성능이 우수하고, 코딩이 불필요하며, 선언하고 수정하기가 용이하므로
가능하다면 제약조건을 사용하는 것이 좋습니다.
01. 트리거(trigger)
트리거는 명시된 이벤트(데이터베이스의 갱신)가 발생할 때마다 DBMS가 자동적으로 수행하는,
사용자가 정의하는 문(프로시저)이다. 트리거는 데이터베이스의 무결성을 유지하기 위한 일반적이고
강력한 도구이며, 테이블 정의 시 표현할 수 없는 기업의 비즈니스 규칙들을 시행하는 역할을 합니다.
무결성 제약조건을 유지하기 위하여 데이터베이스 갱신을 모니터링하고,
데이터베이스 갱신을 전파합니다. 한 릴레이션에 대해서 삽입, 삭제, 수정이 발생하여 트리거가 활성화되면
트리거의 코드가 데이터베이스에 대해 실행됩니다.
트리거를 명시하려면 트리거를 활성화시키는 사건인 이벤트, 트리거가 활성화되었을 때 수행되는
테스트인 조건, 트리거가 활성화되고 조건이 참일 때 수행되는 문(프로시저)인 동작을 표현해야 합니다.
트리거를 이벤트-조건-동작(ECA) 규칙이라고도 부릅니다.
여기서 E는 Event, C는 Condition, A는 Action을 의미합니다. 트리거는 SQL3 표준에 포함되었으며
대부분의 상용 관계 DBMS에서 제공됩니다.
[SQL3에서 트리거의 형식]
CREATE TRIGGER <트리거 이름>
AFTER <트리거를 유발하는 이벤트들이 OR로 연결된 리스트> ON <릴레이션> ← 이벤트
[ WHEN <조건> ] ← 조건
BEGIN <SQL문(들)> END ← 동작
트리거에서 명시할 수 있는 이벤트는 외래 키 위반뿐만 아니라 보다 일반적인 이벤트도 포함합니다.
이벤트는 테이블에 대한 INSERT문, DELETE문, UPDATE문입니다.
SELECT문은 테이블을 갱신하지 않으므로 이벤트가 될 수 없습니다. 조건은 임의의 형태의 프레디키트입니다.
WHERE절의 표현할 수 있는 어떤 형태도 조건으로 명시할 수 있습니다. 동작은 데이터베이스에 대한
임의의 갱신입니다. 하나의 SQL문 또는 내포된 SQL문을 포함한 프로그램이 될 수 있습니다.
트리거가 제약조건과 유사하지만 어떤 이벤트가 발생했을 때 조건이 참이 되면 트리거가 연관된 동작이 수행되고,
그렇지 않으면 아무 동작도 수행되지 않습니다. 트리거는 능동 데이터베이스(active database)의 중요한 특징입니다.
각 SQL문이 수행된 후에(immediate) 또는 한 트랜잭션의 수행이 종료된 후에(deferred) 검사가 이루어집니다.
테이블 수준의 트리거와 행 수준의 트리거로 구분합니다. 또한 삽입, 삭제, 수정 등이 일어나기 전(before)에 동작하는
트리거와 일어난 후(after)에 동작하는 트리거로 구분됩니다.
트리거가 데이터베이스의 일관성을 유지하는 데 매우 유용하지만 트리거를 과도하게 사용하면 복잡한 상호 의존성을
야기할 수 있습니다. 대규모 데이터베이스 응용에서는 복잡한 상호 의존성을 관리하는 것이 어렵습니다.
예를 들어, 하나의 트리거가 활성화되어 이 트리거 내의 한 SQL문이 수행되고, 그 결과로 다른 트리거를 활성화하여
그 트리거 내의 SQL문이 수행될 수 있습니다. 이처럼 한 트리거 내의 SQL문이 다른 트리거의 활성화를 유발한다면
트리거들이 연쇄된다고 말합니다.
트리거를 과도하게 사용하지 않더라도 트리거를 작성할 땐 신중히 해야 합니다.
왜냐하면 트리거는 조건이 맞으면 자동적으로 수행되기 때문에 사용자가 트리거의 영향을 인식하지
못할 수 있기 때문입니다.
02. 주장(assertion)
주장의 조건은 그 조건을 위배할 가능성이 있는 각 갱신문마다 검사됩니다.
주장은 SQL3에 포함되어 있으나 대부분의 상용 관계 DBMS가 아직 지원하고 있지 않습니다.
트리거는 제약조건을 위반했을 때 수행할 동작을 명시하는 것이고, 주장은 제약조건을 위반하는 연산이
수행되지 않도록 하는 것입니다. 주장을 정의하는 구문은 다음과 같으며, 릴레이션과 마찬가지로
불필요한 주장은 DROP문을 사용하여 삭제할 수 있습니다.
CREATE ASSERTION 이름
CHECK 조건 ;
주장은 트리거보다 좀 더 일반적인 무결성 제약조건입니다.
주장은 데이터베이스가 항상 만족하기를 바라는 조건을 직접적으로 표현하는 프레디키트입니다.
일반적으로 두 개 이상의 테이블에 영향을 미치는 제약조건을 명시하기 위해 사용됩니다.
DBMS는 주장의 프레디키트를 검사하여 만일 참이면 주장을 위배하지 않는 경우이므로
데이터베이스 수정을 허용합니다.
주장이 명시되었을 때 DBMS는 이 주장의 유효성을 검사합니다. 주장이 복잡하다면 유효성 검사가 상당한
오버헤드(질의의 평가)를 유발할 수 있으므로 주장을 신중하게 사용해야 합니다.
03. 내포된 SQL
SQL은 강력한 선언적인 언어입니다. SQL에서 질의를 작성하는 것은,
일반적으로 고급 프로그래밍 언어(호스트 언어)를 사용하여 동일한 질의를 코딩하는 것보다 간단합니다.
사용자의 관점에서 호스트 언어와 SQL을 함께 사용하여 데이터베이스를 접근하는 이유는
SQL이 호스트 언어의 완전한 표현력을 갖고 있지 않기 때문에 모든 질의를 SQL로 표현할 수 없기 때문입니다.
이런 질의를 표현하기 위해서는 SQL을 보다 강력한 언어에 내포시켜야 가능합니다.
SQL은 사용하기 쉬운 언어이지만 호스트 언어가 갖고 있는 조건문(IF문), 반복문(WHILE문),
입출력 등과 같은 연산, 사용자와의 상호 작용, 질의 결과를 GUI로 보내는 등의 기능을 갖고 있지 않습니다.
따라서 C, C++, 코볼, 자바 등의 언어로 작성하는 프로그램에 SQL문을 삽입하여,
데이터베이스를 접근하는 부분은 SQL이 맡고 SQL에 없는 기능은 호스트 언어로
작성하는 것이 필요합니다. 호스트 언어에 포함되는 SQL문을 내포된 SQL이라고 부릅니다.
[IT 공부하기/데이터베이스] - 데이터베이스 설계와 개요에 대하여
데이터베이스 설계와 개요에 대하여
01. 데이터베이스 설계 데이터 모델링은 관계 DBMS 세계에서 가장 어렵고 가장 중요한 업무 중 하나입니다. 데이터 모델링을 잘못하면 조직체의 응용은 사용자의 요구를 만족시키지 못할 수 있으
soonirism.tistory.com
'💕IT 공부하기 > 데이터베이스' 카테고리의 다른 글
ER모델에 대해 알고계신가요? (1) (0) | 2022.09.01 |
---|---|
데이터베이스 설계와 개요에 대하여 (0) | 2022.08.31 |
SQL의 데이터베이스 갱신의 세가지 명령어 (0) | 2022.08.29 |
SQL의 SELECT문에 대하여(3) (0) | 2022.08.27 |
SQL의 SELECT문에 대하여(2) (0) | 2022.08.26 |