데이터베이스의 특정 이벤트가 발생할 때 자동으로 실행되는 일련의 작업들을 말한다.
데이터의 일관성과 무결성을 유지하기 위해 사용한다.
자동화: 트리거를 사용하면 특정 이벤트가 발생할 때마다 자동으로 작업이 실행되므로, 작업의 자동화가 가능해진다.
일관성: 트리거를 사용하면 데이터베이스의 일관성을 유지하기 위한 작업이 자동으로 실행되므로, 데이터 일관성을 보장할 수 있다.
데이터 변경 시 자동으로 로그를 기록하고, 변경 이력을 추적한다.
특정 테이블에 데이터가 삽입되거나 삭제될 때, 해당 데이터의 관련 데이터도 함께 삭제하거나 수정한다.
-- insert 에는 idx가 없고, update에는 idx가 있음
create or REPLACE TRIGGER student3_insert_trg
-- for each row (:old.score, :new score)
-- declare
-- after는 insert로 값을 넣은 다음에 update 실행
AFTER
insert on student3
-- insert만 걸어 놓았기 때문에 수정시에는 트리거가 실행되지 않는다.
begin
update student3
set
total = kor + eng + mat,
average = (kor + eng + mat)/3;
end;
create or replace trigger student3_trg 구문을 사용하여 student3_trg라는 이름의 트리거를 생성한다. 이 트리거는 student3 테이블에 대한 트리거이며, 트리거는 insert 이벤트가 발생한 후에 실행된다.
트리거는 begin과 end 사이에 있는 코드 블록으로 구성되어 있다. 이 코드 블록은 insert 이벤트가 발생하면 실행되며, student3 테이블의 total과 average 열 값을 갱신하는 역할을 한다.
total 열은 kor, eng, math 열 값의 합을 저장하고, average 열은 kor, eng, math 열 값의 평균을 저장한다. 이를 위해 update 문을 사용하여 student3 테이블의 total과 average 열 값을 갱신한다.
이 코드는 데이터 일관성과 무결성을 유지하기 위한 목적으로 사용된다. insert 이벤트가 발생하면 자동으로 total과 average 열 값을 갱신하여 데이터 일관성을 보장한다.
create or replace trigger student3_update_trg
-- BEFORE를 사용하므로, 업데이트가 수행되기 전에 트리거 내부의 코드가 실행된다.
-- 이를 통해 새로운 값으로 업데이트하기 전에 트리거를 통해 값을 수정할 수 있다.
before
update of kor, eng, math on student3
-- for each가 없으면 new, old를 사용할 수 없다
for each row -- (old.score, :new.score)
-- update 시에는 다시 update를 수행하지 않고 new에 값을 대입하는 형식으로 진행
-- for each row 를 사용하여 :new와 :old로 구분
-- := 는 대입 연산이다
begin
-- 트리거 내부의 코드는 :new.total과 :new.average 에 업데이트될 값을 대입한다
:new.total := :new.kor + :new.eng + :new.math; -- 합계를 새로운 값으로 계산해주고나서 update로 들어간다
:new.average := (:new.kor + :new.eng + :new.math) / 3; -- 평균을 새로운 값으로 계산해주고나서 update로 들어간다
end;
-- 이 트리거는 kor, eng, math 열 중 하나라도 업데이트될 때마다 해당 레코드의 total과 average 열을 자동으로 갱신하여 데이터 일관성을 유지한다
create or replace trigger student3_update_trg 구문을 사용하여 student3_update_trg라는 이름의 트리거를 생성한다. 이 트리거는 student3 테이블에 대한 트리거이며, 업데이트 이벤트가 발생하기 전에 실행된다.
트리거는 before과 after 중 하나를 선택하여 사용할 수 있으며, 이 경우에는 before을 사용한다. 업데이트 이벤트가 발생하기 전에 트리거 내부의 코드가 실행되므로, 업데이트 이벤트가 발생하기 전에 새로운 값을 수정할 수 있다.
for each row 구문은 업데이트 이벤트가 발생하는 각 행에 대해 코드 블록을 실행하도록 지정하는 역할을 한다. 이를 통해 업데이트 이벤트가 발생하는 모든 행에 대해 트리거를 실행할 수 있다.
트리거 내부의 코드 블록에서는 :new.total과 :new.average에 업데이트될 값을 대입한다. 업데이트될 값은 :new.kor, :new.eng, :new.math 열 값의 합과 평균으로 계산된다. 이를 위해 :new.kor, :new.eng, :new.math 열 값의 합을 계산하여 :new.total에 대입하고, 합의 평균을 계산하여 :new.average에 대입한다.
이 코드는 업데이트 이벤트가 발생하기 전에 자동으로 total과 average 열 값을 갱신하여 데이터 일관성을 보장하는 목적으로 사용된다. 새로운 값으로 업데이트하기 전에 트리거를 통해 값을 수정할 수 있으며, 이를 통해 데이터 무결성을 유지할 수 있다.