Oracle 에서 트리거 예시 상세 설명

9990 단어 Oacle트리거
머리말
ORACLE 시스템 에 서 는 트리거 유사 과정 과 함수 에 대해 성명,실행 및 이상 처리 과정의 PL/SQL 블록 이 있 습 니 다.
트리거 종류
트리거 는 데이터베이스 에 독립 된 대상 으로 저장 되 어 있 습 니 다.저장 과정 과 함수 와 달리 저장 과정 과 함 수 는 사용자 가 표시 하고 호출 해 야 실행 되 며 트리거 는 하나의 이벤트 로 실 행 됩 니 다.즉 트리거 는 어떤 사건 이 발생 했 을 때 자동 으로 암시 적 으로 작 동 하 는 것 이다.또한 트리거 는 파 라 메 터 를 받 을 수 없습니다.그래서 트리거 를 실행 하 는 것 을 트리거 나 점화(firing)라 고 합 니 다.ORACLE 이 벤트 는 데이터베이스 의 테이블 에 대한 INSERT,UPDATE 및 DELETE 조작 또는 보기 에 대한 유사 한 조작 을 가리킨다.ORACLE 는 데이터베이스 의 시작 과 닫 기 등 트리거 ORACLE 로 트리거 기능 을 확장 합 니 다.따라서 트리거 는 데이터 뱅 크 의 완전 성 제약 으로 완성 하기 어 려 운 복잡 한 업무 규칙 에 대한 제약 을 완성 하거나 데이터 뱅 크 에 대한 각종 조작 을 감시 하여 감사 기능 을 실현 하 는 데 자주 사용 된다.
개발 에 서 는 반드시 Oracle 의 트리거 를 사용 할 것 이 므 로 본 고 는 상세 하 게 설명 한다.
이 인 스 턴 스 에서 사용 하 는 것 은 주로 Oracle 에서 scott 사용자 의 emp 와 dept 표 입 니 다.데 이 터 는 다음 과 같 습 니 다.

트리거 개념
1.개념:
트리거 의 본질은 저장 과정 으로 말 그대로 특정 이벤트 가 발생 할 때 Oracle 은 트리거 의 코드 를 실행 합 니 다.그 구성 을 세분 화하 면 세 부분 으로 나 눌 수 있다.첫 번 째 부분 은 어떤 조건 에서 트리거 가 실행 되 는 지,즉 트리거 가 촉발 되 는 사건 이다.두 번 째 부분 은 트리거 즉 트리거 의 발생 사건 을 언제 실행 합 니까?예 를 들 어 before,after.세 번 째 부분 트리거 자체 가 해 야 할 일 은 트리거 가 트리거 된 후에 구체 적 으로 표현 하고 자 하 는 사건 입 니 다.begin 과 end 사이 의 sql 입 니 다.
2.트리거 의 분류:
1.dl 트리거:즉,dl 작업 을 실행 한 후에 발생 하 는 이벤트 입 니 다.
자주 사용 하 는 ddl 작업 은 grant(권한 수여),revoke(권한 수여 취소),create(생 성),drop(삭제),alter(수정),comment(주석),audit(심사),rename(이름 바 꾸 기)이 있 습 니 다.구체 적 인 인 인 인 스 턴 스 를 진행 하기 전에 다른 개념 을 설명 합 니 다.Oacle 의 user 와 schema:
user:oracle 의 사용 자 는 데이터베이스 의 대상 과 데이터베이스 대상 에 대한 삭제 와 검사 권한 을 가지 고 있 습 니 다.schema:이 사용자 아래 모든 데이터베이스 대상 의 집합 Collection.생활 속 의 집 schema 와 집의 소유자 user 간 의 관계 와 유사 합 니 다.당신 은 사용자 user 입 니 다.alter session 을 통 해 다른 사람의 집 을 볼 수 있 습 니 다.그러나 집 안의 가 구 를 바 꿀 수 있 는 지 여 부 는 이 집의 소유자 가 grant 권한 을 부여 하 는 지 여 부 를 봐 야 합 니 다.당신 이 모든 집의 최고 권한 자 dba 가 아니라면.
ddl Example:scott 사용자 의 모든 ddl 작업 금지

CREATE OR REPLACE TRIGGER scott_trigger
BEFORE DDL
ON SCHEMA
BEGIN
 RAISE_APPLICATION_ERROR(-20008,'  scott     ddl  ');
END;

create sequence myseq;

트리거 를 만 든 후에 도 ddl 작업 을 사용 하면 오류 가 발생 합 니 다.
2.dml 트리거:dml 작업 을 바탕 으로 하 는 트리거 는 줄 트리거 와 문 트리거 로 세분 화 할 수 있 습 니 다.
A.구문 트리거:dml 작업 은 여러 줄 에 영향 을 줄 수 있 고 주로 데이터 에 대한 안전 보호 에 사 용 됩 니 다.
Example:목요일,금요일 에 emp 표 데 이 터 를 수정 하 는 것 을 금지 합 니 다.

CREATE OR REPLACE TRIGGER emp_trigger
BEFORE UPDATE OR DELETE OR INSERT
ON emp
BEGIN
 IF to_char(sysdate,'day') IN ('   ','   ') THEN
 RAISE_APPLICATION_ERROR(-20008,'          emp ');
 END IF;
END;

update emp set sal=800;

여기 서 트리거 를 만 든 후에 모든 사람의 월급 을 바 꾸 려 고 할 때 트리거 의 오류 가 발생 하고 모든 사람의 월급 은 많은 줄 에 영향 을 줄 것 임 을 나타 낸다.
B.줄 트리거:동작 이 필요 한 줄 에 대한 키워드:for each row,사용
(1)데이터 의 감사 기능 을 실현 한다.
Example:직원 정 보 를 삭제 하 는 표 기록 을 작성 하여 직원 의 정 보 를 삭제 합 니 다.
Oacle 의 emp 표 데 이 터 를 바 꾸 지 않 기 위해 emp 를 새로 만 듭 니 다.새 시계

create table emp_new
as
select * from emp;

create table emp_audit(name varchar2(10),delete_time Date);

CREATE OR REPLACE TRIGGER delete_trigger
AFTER DELETE ON emp_new
FOR EACH ROW
BEGIN
 INSERT INTO emp_audit values(:old.ename,sysdate);
END;

delete from emp_new where empno='7499';

select * from emp_audit;

트리거 를 만 들 때 for each row 키 워드 를 사용 한 것 을 볼 수 있 습 니 다.old.***는 이전 표 의 데 이 터 를 변경 하 는 데 사 용 됩 니 다.new.***는 변 경 된 데 이 터 를 표시 하고 데 이 터 를 삭제 한 후에 로그 표 에 해당 하 는 기록 이 있 습 니 다.
(2)데이터 완전 성 실현:
Example:직원 에 게 임금 인상 을 요구 한 후에 원래 의 임금 보다 낮 으 면 안 되 고 오 른 임금 도 원래 의 50%보다 높 으 면 안 됩 니 다.
Oacle 의 emp 표 데 이 터 를 바 꾸 지 않 기 위해 emp 를 새로 만 듭 니 다.새 시계

create table emp_new
as
select * from emp;

CREATE OR REPLACE TRIGGER emp_trigger
BEFORE UPDATE OF sal ON emp_new
FOR EACH ROW
WHEN (new.sal<old.sal OR new.sal>1.5*old.sal)
BEGIN
 RAISE_APPLICATION_ERROR(-20008,'      ,       50%');
END;

update emp_new set sal = 1.6*sal where empno='7788';

데 이 터 를 변경 할 때 트리거 오류 가 발생 하 는 것 을 볼 수 있 습 니 다.표 의 한 필드 에 대한 수정 은 UPDATE OF 를 사용 하면 됩 니 다.또한 new 와 old 가 PLSQL 블록 외부 인 BEGIN 밖 에 있 으 면 콜론 을 추가 할 수 없습니다.
(3)완전 성 참조:
Example:dept 표 의 deptno 를 업데이트 할 때 emp 표 의 deptno 도 업데이트 합 니 다.
새 두 개의 시 계 는 각각 emp 표 dept 표 의 데이터 와 같 습 니 다.

create table emp_new
as
select * from emp;

create table dept_new
as
select * from dept;

CREATE OR REPLACE TRIGGER cascade_trigger
AFTER UPDATE OF deptno ON dept_new
FOR EACH ROW
BEGIN
 UPDATE emp_new SET deptno=:new.deptno WHERE deptno=:old.deptno;
END;

update dept_new set deptno=15 where deptno=20;

select * from dept_new;

select * from emp_new;

이 는 메 인 관계 가 있 는 여러 개의 표를 참조 하여 메 인 키 를 업데이트 할 때 표 에서 관련 데 이 터 를 업데이트 해 야 합 니 다.
3.대체 트리거:
여기 서 다른 개념 을 먼저 말씀 드 리 겠 습 니 다:with check option 이 있 는 보기:
보기 의 정의 가 조건(예 를 들 어 where 자구)을 포함 하고 이 보기 에 적용 되 는 INSERT 나 UPDATE 문구 가 모두 이 조건 을 포함 해 야 한다 면 WITH CHECK OPTION 을 사용 하여 보 기 를 정의 해 야 합 니 다.
Example:

CREATE VIEW emp_view
(ename,empno)
AS SELECT ename,empno FROM emp 
WHERE deptno=20
WITH CHECK OPTION;
여기에 조건 부 번호 가 20 이면 이 보 기 를 수정 하 는 모든 문 구 는 20 번 부서 의 직원 을 대상 으로 해 야 한다.
트리거 의 개념 을 계속 대체 합 니 다:키워드 insteadof 는 주로 복잡 한 보 기 를 대상 으로 합 니 다.직렬 연결 표 에서 발생 하 는 보 기 는 update,insert,delete 등 키 워드 를 사용 할 수 없고 before,after 등 키워드 가 없 으 며 with check option 옵션 의 보기에 서 만 들 수 없습니다.예 를 들 어 emp 표 와 dept 표 의 직렬 연결 보 기 를 새로 만 들 수 없습니다.데 이 터 를 추가 할 수 없습니다.지금 트리거 를 통 해 해결 합 니 다.
Example:
새 두 개의 시 계 는 각각 emp 표 dept 표 의 데이터 와 같 습 니 다.

CREATE TABLE emp_new
AS
SELECT * FROM emp;
CREATE TABLE dept_new
AS
SELECT * FROM dept;

CREATE VIEW emp_dept
AS
SELECT d.deptno,d.dname,e.empno,e.ename
FROM dept_new d,emp_new e
WHERE d.deptno=e.deptno;
여기 scott 사용 자 는 sysdba 인증 을 통 해 보 기 를 만 들 수 있 습 니 다.

grant create view to scott;

CREATE OR REPLACE TRIGGER insteadof_trigger
INSTEAD OF INSERT ON emp_dept
FOR EACH ROW
DECLARE
 v_temp INT;
BEGIN
 SELECT COUNT(*) INTO v_temp FROM dept_new WHERE deptno=:new.deptno;
 IF v_temp=0 THEN
  INSERT INTO dept_new(deptno,dname) VALUES(:new.deptno,:new.dname);
 END IF;
  SELECT COUNT(*) INTO v_temp FROM emp_new WHERE empno=:new.empno;
 IF v_temp=0 THEN
  INSERT INTO emp_new(deptno,empno,ename) VALUES(:new.deptno,:new.empno,:new.ename);
 END IF;
END;

INSERT INTO emp_dept values(15,'HUMANRESOURCE',7999,'LEAF');

select * from emp_new;

select * from dept_new;

여기 트리거 에서 보 기 를 insert 할 때 해당 empnew 와 deptnew 를 수정 하면 복잡 한 보기 에 대한 수정 을 할 수 있 습 니 다.
4.시스템 트리거:말 그대로 시스템 트리거 가 촉발 하 는 이벤트,자주 사용 하 는 시스템 이벤트 startup,shutdown,dbroll_change,server error 등.
Example:데이터 베 이 스 를 시작 할 때의 이벤트 와 시간 을 기록 합 니 다.
시스템 트리거 이기 때문에 sysdba 권한 으로 로그 인 해 야 합 니 다.

CREATE TABLE event_table(event VARCHAR2(50),event_time DATE);

CREATE OR REPLACE TRIGGER event_trigger
AFTER STARTUP ON DATABASE
BEGIN
 INSERT INTO event_table VALUES(ora_sysevent,sysdate);
END;

select * from event_table;

3.트리거 의 종합 사례
Example:scott 사용자 의 동작 을 기록 하기 위 한 로 그 를 만 듭 니 다.
먼저 sysdba 권한 하에 로그 시트,시퀀스,트리거 를 만 듭 니 다.

CREATE TABLE object_log(
logid NUMBER CONSTRAINT pk_logid PRIMARY KEY,
operatedate DATE NOT NULL,
objecttype VARCHAR2(50) NOT NULL,
objectowner VARCHAR2(50) NOT NULL
);

CREATE SEQUENCE obj_log_seq;

CREATE OR REPLACE TRIGGER object_trigger
AFTER CREATE OR DROP OR ALTER ON DATABASE
BEGIN
 INSERT INTO object_log VALUES(obj_log_seq.nextval,sysdate,ora_dict_obj_type,ora_dict_obj_owner);
END;
scott 사용자 아래 에 마음대로 만 든 것:

CREATE SEQUENCE my_seq;
sysdba 권한 으로 돌아 가서 로그 시트 에 해당 하 는 기록 이 있 는 지 확인 합 니 다:

SELECT * FROM object_log;

데이터 가 있 는 것 을 발견 하면 로그 시트 가 성공 적 으로 완성 되 었 음 을 설명 하고 일부 사용자 가 조작 하 는 트리거 를 감시 하면 됩 니 다.이로써 트리거 는 모두 설명 이 끝 났 고 부족 한 점 은 댓 글로 설명해 주세요.감사합니다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기