PL/SQL 트리거

최고고·2023년 1월 6일
0
  • 특정 이벤트가 발생할 때 자동으로 동작을 수행하는 프로그램
  • 사용자가 지정해서 실행할수 없음
  • 트리거 생성시 특정 이벤트에 의해서만 자동실행됨
  • 잘못생성하거나 너무많이 생성하면 오히려 성능저하가 생길 수 있다고 함
  • 전체 트리거 조작은 administer database trigger 시스템 권한이 필요 생성CREATE, 삭제 DROP, 수정 ALTER 시 create trigger, alter trigger, drop trigger의 권한 필요
  • 스키마에서 권한 부여
    GRANT CREATE TRIGGER TO 유저;
    GRANT ALTER ANY TRIGGER TO 유저;
    GRANT DROP ANY TRIGGER TO 유저;
  • 데이터베이스에서 권한 부여
    GRANT ADMINISTER DATABASE TRIGGER TO 유저;

트리거 유형

DML 트리거

  • 문장트리거 : 영향 받는 행이 없어도 한번은 실행
  • 행트리거 : 테이블이 이벤트 영향받을때마다 실행
    FOR EACH ROW 구절 사용
    OLD : 트리거가 처리한 레코드 원래값을 저장함
    NEW : 새값을 포함
    이 두가지 값을 가지고 변경 전,후의 데이터 조작 가능
    EX) :OLD.VALUE, :NEW.NO
    사용할때는 앞에 : 을 써야함

DML 아닌 트리거

DDL 이벤트 트리거 : 트리거활용해 DDL작업을 함

데이터베이스 이벤트 트리거 : DB내 생기는 일들을 관리하기 위해 생성하는 트리거

트리거 구조

CREATE OR REPLACE TRIGGER 트리거명
트리거 실행 시점 [BEFORE/AFTER]
이벤트 [INSERT | UPDATE | DELETE]
ON {테이블이름 | 뷰이름| 스키마 | 데이터베이스}
[FOR EACH ROW\   --생략시 문장레벨트리거
BEGIN 

END;

트리거 조회
SELECT * FROM USER_TRIGGERS;

테이블의 데이터가 삭제될때 백업테이블에삭제한 시간과 데이터를 기록하는 트리거
1. 원본테이블, 백업테이블을 create
2. 임의의 데이터 원본에 insert

CREATE OR REPLACE TRIGGER TRI_BACKUP
AFTER DELETE ON TBL_TEST
FOR EACH ROW  	--행레벨 테이블일때 써야됨
BEGIN 
INSERT INTO TBL_TEST_BACK
VALUES(:OLD.NO, :OLD.NAME, SYSDATE);
END;

삭제
DELETE FROM TBL_TEST WHERE NO!=4;
결과 확인시, 삭제된 행이 그대로 INSERT되어있다.

https://bbinya.tistory.com/24#%EC%A-%BC%EC%-A%--%--%ED%-A%B-%EB%A-%AC%EA%B-%B-%--%EC%-C%A-%ED%--%--

0개의 댓글