❗ 트리거(TRIGGER)
- 어떤 이벤트가 발생되면 자동적으로 다른 테이블의 변경동작이 수행 시키는
일종의 프로시져
- 자동적으로 실행되며 수동으로 실행시킬 수 없음
- 트리거 대상 테이블에는 트리거 내용이 존재할 수 없음
- 트렌젝션의 일부로 처리됨. 따라서 트리거 내부에 COMMIT,ROLLBACK,SAVEPOINT 등이
존재할 수 없음
(사용형식)
CREATE [OR REPLACE] TRIGGER 트리거이름
BEFORE|AFTER INSERT|DELETE|UPDATE
ON 테이블명
[FOR EACH ROW]
[WHERE 조건]
[DECLARE]
[선언영역]
BEGIN
트리거 본문;
END;
- 트리거 타이밍 : 트리거 본문이 실행되는 시점으로 BEFORE 또는 AFTER 사용
- 이벤트 : 트리거 본문을 실행시키는 원인이 되는 DML명령으로 OR연산자로 조합 사용 가능
- 트리거 종류
- 문장단위 트리거 : 'FOR EACH ROW'가 생략된 트리거로 DML명령의 결과에 포함된 행의 수와
관계없이 한번만 실행되는 트리거 -- WHEN 조건 사용X
- 행단위 트리거 : 'FOR EACH ROW'가 기술한 트리거로 DML명령의 결과에 포함된 행의 수 만큼
트리거 수행, :OLD, :NEW 의사레코드 사용가능 - 트리거 조건 : 'WHEN 조건'로 기술되며, 트리거 발생에 좀 더 구체적인 조건을 제시할 때 사용
- 트리거 의사레코드와 트리거 함수
- 의사레코드
-------------------------------------------------------------------------
의사레코드 내용
-------------------------------------------------------------------------
:NEW 이벤트가 INSERT, UPDATE일 때 사용되며 새롭게
입력(신규 입력이나 갱신을 위한 값)되는 행을 지칭
DELETE에 사용되면 모든 열이 NULL로 SETTING
:OLD 이벤트가 DELETE, UPDATE일 때 사용되며 삭제 또는 갱신의
대상이 되는 행을 지칭
INSERT에 사용되면 모든 열이 NULL로 SETTING
- 트리거 함수 : 이벤트를 OR연산자로 구성한 경우 이벤트의 종류를 구분하기 위한 함수
--------------------------------------------------------------------------
함수 내용
--------------------------------------------------------------------------
INSERTING 이벤트가 INSERT 이면 true 반환
UPDATING 이벤트가 UPDATE 이면 true 반환
DELETING 이벤트가 DELETE 이면 true 반환
✔사용예) LPROD테이블에서 LPROD_ID가 12번인 자료를 삭제하고 삭제 후 '자료삭제 성공'이라는
메시지를 출력하는 트리거 작성
CREATE OR REPLACE TRIGGER tg_delete_lprod
AFTER DELETE ON LPROD
BEGIN
DBMS_OUTPUT.PUT_LINE('자료삭제 성공');
END;
DELETE FROM LPROD WHERE LPROD_ID >=10;
SELECT * FROM LPROD;
** HR계정의 EMPLOYEES 테이블에서 사원번호,사원명,입사일,직무코드를 조회하여
EMP테이블을 생성하시오
CREATE TABLE EMP AS
SELECT EMPLOYEE_ID AS EMP_ID,
EMP_NAME,
HIRE_DATE,
JOB_ID,
DEPARTMENT_ID AS DEP_ID
FROM HR.EMPLOYEES;
COMMIT;
** HR계정의 EMP테이블을 복사하여 RETIRE 테이블을 생성하시오 모든 자료는 삭제
CREATE TABLE RETIRE AS
SELECT * FROM EMP;
DELETE FROM RETIRE;
✔사용예) EMP테이블에서 사원번호 121~125번 사원을 삭제하시오. 단 삭제전 해당사원의 자료를
RETIRE 테이블에 저장하시오
CREATE OR REPLACE TRIGGER tg_delete_emp
BEFORE DELETE OR UPDATE ON EMP
FOR EACH ROW
BEGIN
INSERT INTO RETIRE VALUES(:OLD.EMP_ID,:OLD.EMP_NAME,:OLD.HIRE_DATE,
:OLD.JOB_ID,:OLD.DEP_ID);
END;
DELETE FROM EMP WHERE EMP_ID =121 AND EMP_ID<=125;
✔ 사용예)장바구니에 입력,수정,삭제가 발생되었을때 재고 수불테이블에 재고 변경을
수행하는 트리거를 작성하시오.
CREATE OR REPLACE TRIGGER tg_cart_change
AFTER INSERT OR UPDATE OR DELETE ON CART
FOR EACH ROW
DECLARE
L_QTY NUMBER:=0;
L_PID PROD.PROD_ID%TYPE;
L_DATE DATE;
BEGIN
IF INSERTING THEN
L_QTY:=(:NEW.CART_QTY);
L_PID:=(:NEW.CART_PROD);
L_DATE:=TO_DATE(SUBSTR(:NEW.CART_NO,1,8));
ELSIF UPDATING THEN
L_QTY:=(:NEW.CART_QTY-:OLD.CART_QTY);
L_PID:=(:NEW.CART_PROD);
L_DATE:=TO_DATE(SUBSTR(:NEW.CART_NO,1,8));
ELSIF DELETING THEN
L_QTY:=-(:OLD.CART_QTY);
L_PID:=(:OLD.CART_PROD);
L_DATE:=TO_DATE(SUBSTR(:OLD.CART_NO,1,8));
END IF;
UPDATE REMAIN A
SET A.REMAIN_O=A.REMAIN_O+L_QTY,
A.REMAIN_J_99=A.REMAIN_J_99-L_QTY,
A.REMAIN_DATE=L_DATE
WHERE A.REMAIN_YEAR='2020'
AND A.PROD_ID=L_PID;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('예외발생'||SQLERRM);
END;
EXECUTE insert_cart_proc('b001',SYSDATE,'P201000001',10);
UPDATE CART
SET CART_QTY = 15
WHERE CART_PROD='P201000001'
AND CART_NO = '2022120200003';
DELETE FROM CART
WHERE CART_PROD='P201000001'
AND CART_NO = '2022120200003';
'ORACLE 복습 & 정리' 카테고리의 다른 글
[ORACLE] 패키지 221202-03 (0) | 2022.12.05 |
---|---|
[ORACLE] 패키지 221202-03 (0) | 2022.12.02 |
[ORACLE] 함수 221202-01 (0) | 2022.12.02 |
[ORACLE] 저장프로시져 221201-04 (1) | 2022.12.01 |
[ORACLE] 반복문 221201-03 (0) | 2022.12.01 |