이번엔 트리거(Trigger)에 대해서 알아 볼 것이다.
트리거(Trigger)
트리거는 사전적 의미로 '방아쇠를 당기다'인데 쿼리에서 어느 지정한 조건이 만족되면 연관된 다른 이벤트가 발생하게 한다. SQL 실행 시기를 기준으로 before 트리거( INSERT, UPDATE, DELETE 실행하기 전에 트리거 먼저 실행 됨), after 트리거( INSERT, UPDATE, DELETE 실행하고 난 후 트리거 실행 됨)가 있고, 실행 시 영향을 받는 곳을 기준으로 row 트리거(행:실행된 트리거가 row(행) 하나하나 마다 실행 됨), statement 트리거(문장:실행된 트리거가 INSERT,UPDATE,DELETE 문장에 한 번만 실행 됨)이 있다.
트리거는 트랜잭션 제어문(COMMIT, ROLLBACK, SAVEPOINT)을 사용할 수 없고, 트리거는 트리거 문장의 실행 부분으로써 실행되므로 트리거링 문장과 같은 트랜잭션에 있다고 볼 수 있으며, 트리거링 문장이 COMMIT, ROLLBACK되면 트리거의 작업도 COMMIT, ROLLBACK 되게 된다.
트리거에서 변수를 선언할 때 DECLARE를 써야 하고, 변수 선언 뒤에는 ; 으로 끝내야 한다. 보통
CREATE OR REPLACE TRIGGER 트리거_명
TIMING[BEFORE|AFTER] EVENT[INSERT|UPDATE|DELETE] ON 테이블_명
[FOR EACH ROW]
BEGIN
~
END; 구문이다.
트리거는 데이터의 무결성(integrity)을 보장하기 위해서 제약조건(constraints) 설정의 보조 역할도 한다. 예를 들어 사원 급여를 추가/수정할 때 기존 제약 조건 중 CHECK 제약조건을 이용해서 사원급여는 0보다 커야 된다(salary>0)는 것을 보았다. 사원은 직무에 따라서 해당 직무의 최소 급여와 최대 급여의 범위를 지정하고, 이 범위를 벗어나는 급료가 책정되면 제약조건의 위배가 되게 만들 때 트리거를 사용할 수 있다.
CREATE OR REPLACE TRIGGER Print_Message
AFTER INSERT ON departments
BEGIN
DBMS_OUTPUT.PUT_LINE('정상적으로 데이터가 추가 되었습니다!');
END;
PS/SQL
PL/SQL은 선언적인 SQL 언어와는 달리 SQL을 프로그래밍해서 처리하는 기법이다.
보통 컴파일러가 이해할 수 있도록
DECLARE
--- 선언(선택)
BEGIN
--- 실행 코드 (필수)
EXCEPTION
---예외 처리(선택)
END;
/ 구문으로 해준다. 여기서
∎ 선언 부분에서는 실행문에서 사용될 변수, 쿼리 수행결과로 반환되는 여러 행을 처리해주는 커서(Cursor), 사용자 정의 예외 등을 정의하고,
∎ 실행 부분에서는 질의문이나 DML 문, 그리고 조건이나 제어문(IF 문, LOOP 문)을 정의하며,
∎ 예외처리 부분은 실행 시 발생 가능한 예외를 정의하고 예외 발생 시 처리하는 구문을 정의해준다. 변수는 미리 선언한 뒤 나중에 값을 줄 수도 있지만, 선언과 동시에 값을 줄 수도 있다.
∎ 변수는 '변수_명 데이터_타입'으로 해준다. 변수에 값 할당은 '변수_명 := 값'식으로 해준다. 변수의 선언과 동시에 값을 넣을 수 있다.
=>과정은 Programming =>Compile =>Execution으로 진행되고 Compile에서 문제가 있으면 Debugging 하게 된다.
●EX
create or replace trigger print_message
after insert on departments
begin
dbms_out.put_line('정상적으로 데이터가 추가 되었습니다');
end;
/
set serverouput on;
insert into departments(department_id, department_name) values(290, 'IT_EDU');
*****PL/SQL 구문
set serveroutput on;// 화면에 출력되게 해준다
begin
dbms_output.put_line('Hello World');
end;
/
declare
l_message varchar2(100);
begin
l_message := 'Hello World';
dbms_output.put_line(l_message);
end;
'DB > SQLPLUS' 카테고리의 다른 글
| [ORACLE] 저장프로시저 (0) | 2022.06.20 |
|---|---|
| [ORACLE] Cursor(커서) (0) | 2022.06.20 |
| [ORACLE] data dictionary (0) | 2022.06.20 |
| [ORACLE] MERGE(머지) (0) | 2022.06.20 |
| [ORACLE] Sysnonym(동의어) (0) | 2022.06.20 |
댓글