PL / SQL 트리거 기초 및 예


트리거 소개;
트리거 의 정 의 는 어떤 조건 이 성립 될 때 트리거 에 정 의 된 문 구 는 자동 으로 실행 된다 는 것 이다.따라서 트리거 는 인위적인 호출 이 필요 없고 호출 이 불가능 하 다.트리거 와 프로 세 스 함수 유사 프로 세 스 함수 가 호출 되 어야 합 니 다.
 
         12       ,                       ,


    :         ,    :
before:               ;
after:               。
    :                :
insert:            ;
update:            ;
delete:            。
   :          。
for each row:             。        ,          。
 

트리거 생 성 문법:
 
트리거 emp 표 에 추 가 된 데 이 터 를 emp 에 추가 합 니 다.bak 중
1) scott 사용자 의 emp 표 구 조 를 복사 합 니 다.
 
create table emp_bak as select * from emp where 1=2;

2) emp 표 에 데 이 터 를 삽입 합 니 다.
 
--     emp
insert into emp values(1234,'wangerxiao','SALESMAN',7902,to_date('1990-1-1','yyyy-mm-dd'),1000,100,20);

 
3) emp 표를 만 들 고 추 가 된 트리거 를 삭제 합 니 다.
create  or replace trigger tr_emp --     
before delete --    
on emp_bak  -- emp_bak  
for each row --     
begin
--:old          :new        
  insert into emp_copy values(:old.empno,:old.ename,:old.job,:old.mgr,:old.hiredate,:old.sal,:old.comm,:old.deptno);
end;

 
4), 추 가 된 데이터 삭제
SQL> delete from emp_bak where empno=1234;
 
1 row deleted

 
5), 검색 empbak 시계
데이터 가 emp 에 추가 되 었 습 니 다.bak 시계 맞았어 요.
SQL> select * from emp_bak;
 
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 1234 wangerxiao SALESMAN   7902 1990/1/1      1000.00    100.00     20

 
6), 트리거 삭제
drop trigger tr_emp;

 
 
상술 한 예 를 완성 하면, 우 리 는 이미 기본 적 인 트리거 를 만 들 것 이다
 
 
 
2. 트리거 를 사용 하여 사용자 emp 의 표 조작 을 제한 합 니 다 (비 근무 시간 에 데이터 만 조회 할 수 있 습 니 다)
-- emp 표 수정 (INSERT, DELETE, UPDATE 포함) 에 대한 시간 범 위 를 제한한다. 즉, 비 근무 시간 (주말, 8: 30 이전 17: 30 이후) 에 emp 표를 수정 하 는 것 을 허용 하지 않 는 다.
 
트리거 생 성
create or replace trigger tr_emps
before delete or update or insert
on emp
for each row
begin
   if (to_char(sysdate,'DAY') in ('   ','   ') or 

to_char(sysdate,'HH24:MI') not between '08:30' and '22:00' )  then
    raise_application_error(-20001,'           '); 
end if;
end;

트리거 제한 을 사용 할 때 사용자 가 입력 한 것 이 잘못 되 었 을 수 있 으 므 로 이상 을 정의 해 야 합 니 다.
 
 raise_application_error(-20001,'           '); 

 
8 시 30 분부 터 22 시 까지 삭제, 업데이트, 추가 가능
SQL> update emp set sal=1000 where ename='SMITH';
 
1 row updated

 
정 해진 시간 내 에 데 이 터 를 업데이트 하지 않 습 니 다.
SQL> update emp set sal=1000 where ename='SMITH';
 
update emp set sal=1000 where ename='SMITH'
 
ORA-20001:           

 
ORA-06512:   "SCOTT.TR_EMPS", line 7
ORA-04088:     'SCOTT.TR_EMPS'        
 

 
 
트리거 한정 조작
-- 부서 번호 가 10 인 기록 에 대해 서 만 행 트리거 조작 을 한정 했다.변 경 된 sal 과 comm 가 지금 보다 적 으 면 오 류 를 보고 하고 기록 을 삭제 하면 오 류 를 보고 하 며 다른 작업 이 실 행 됩 니 다.
 
create or replace trigger tr_emps
brfore update of sal, comm or dalete
on emp
for each row
  when (old.deptno=10)--       10      
begin
    case
      when updating('sal') then
      if :old.sal<:new.sal then
       raise_application_error(-20002,'      ');
      end  if;
     when updating('comm') then
      if :old.comm<:new.comm then
      raise_application_error(-20003,'      !');
    end if;
  when deleting then
  raise_application_error(-20004,'           ');
     
    end case;
end;

 
 
트리거 의 온라인 업데이트
-- 행 트리거 를 이용 하여 직렬 업 데 이 트 를 실현 합 니 다 -- dept 표 부서 번 호 를 새 값 으로 바 꾸 면 emp 표 의 모든 부서 번 호 를 새 값 으로 바 꿔 야 합 니 다.
create or replace trigger tr_update_demp
after update of deptno
on dept
for each row
  begin
    update emp set deptno=:new.deptno where deptno=:old.deptno;
  end;

 
 
 
 
 
 
 
 
 
 
 
 
트리거 의 보기 조작
 
 
 
 
 

좋은 웹페이지 즐겨찾기