2009. 3. 14. 03:46 Program.../Oracle

Oracle Trigger

--- ○ Trigger
-- 트리거의 종류
-- 1. before trigger : DML이 발생하기 이전에 검사할때 사용
-- 2. after trigger (가장많이 쓰임) : DML이 발생한후 
-- 3. 문장 trigger
-- 4. 행 trigger (가장많이 쓰임)
create table workchart
(no number
,nalja date default sysdate
,work varchar2(300)
)tablespace users;
--// workchart테이블에 DML작업은 업무시간에만 가능하도록 Before & 문장 trigger를 작성
--   업무시간대란? 월-금, 09:00 - 16:00 이전까지
create or replace trigger btri_workchart
before
insert or update or delete on workchart
declare
    worknottime exception; -- exception : 사용자가 정의하는 오류메세지 임을 정의

begin
  if to_char(sysdate,'d') in ('1','7') or
   to_number(to_char(sysdate,'hh24')) < 9 or
   to_number(to_char(sysdate,'hh24')) > 15
  then raise worknottime; -- raise 오류내용 변수 : 사용자가 정의한 오류메세지를 띄운다.
  -- then 다음에 사용자가 정의하는 오류내용과 DML작업을 할 수 없게 한다.
  end if;
  exception
      when worknottime then
          raise_application_error
       (-20001,'월요일부터 금요일 오전9시부터 오후4시까지만 작업이 가능합니다.');
          -- 오류번호는 -20001~-20999까지만 사용가능하다.
  --insert or update or delete를 하기전에 if문 조건에 맞으면 해당 오류번호와 오류 메세지를 출력한다.
end;
/
select * from workchart;
insert into workchart(no,work) values(1,'일을 열심히 했음')
-- 위트리거 생성 조건에 맞으면 DML문이 실행이 안되고 아니면 실행이 된다.
alter trigger btri_workchart disable; -- 비활성화 시키면 트리거 조건에 상관없이 입력된다.
----------------------------------------------------------------------------------------------
--// After & 행 트리거
create table member
(id varchar2(20),
passwd varchar2(20) constraint member_passwd_nn not null,
name varchar2(20) constraint member_name_nn not null,
hp varchar2(20),
constraint member_id_pk primary key(id) using index tablespace indx
) tablespace users;

create table login
(id varchar2(20),
passwd varchar2(20),
constraint login_id_pk primary key(id) using index tablespace indx,
constraint login_id_fk foreign key(id)
     references member(id) on delete cascade
) tablespace users;

select * from member;
select * from login;
---- member 테이블 입력값중 특정행을  1:1 관계에 있는 login테이블에 자동으로 입력이 되도록
---- 하는 것을 after & 행 trigger라고 한다.
create or replace trigger atri_member_ins
after
insert on member -- 멤버 테이블에서 입력이 되어진 다음에 
for each row     -- 특정행을 잡아낸다. (행트리거일때 항시 사용)

begin
  insert into login values(:new.id, :new.passwd);
  -- trigger내에서 방금 입력된값은 :new에 저장이 되어진다.
end;
/
insert into member values('superman','pass123','홍길동','010-6647-6348');
insert into member values('eom','junghwa','엄정화','019-8897-1567');
-- member 테이블에 값을 입력하면 자동적으로 login테이블에 입력이 된다.
-- update = 기존date delete + 새로운date insert
create or replace trigger atri_member_upd
after
update of id,passwd on member -- update 다음에 변경되어질 컬럼을 항시 명시해 주어야 한다.
             -- 변경되어지기 이전값은 (:old)에 저장이 되어진다.
for each row
begin
  update login set id = :new.id, passwd = :new.passwd
  where id = :old.id;
end;
/
update member set id='batman', passwd='pass007'
where id='superman';

update member set passwd='pass007'
where id='superman';
commit;
rollback;

delete member
where id='superman';
-----------------------------------------------------------------------------------------
select * from DEPT;
select * from emp;
----- 1:다 관계의 두 테이블에서 1:1처럼 on delete cascade로 자동 삭제가 되지 않지만
--    트리거를 이용하여 참조하는 pk,fk를 자동으로 변경시켜줄 수 있다.
create or replace trigger aftri_upd
after  update of deptno on dept
for each row
begin
  update emp set deptno = :new.deptno
  where deptno = :old.deptno;
end;
/
update dept set deptno=11
where deptno = 10
--- 1:다 관계의 테이블에서 부모테이블의 pk가 변경되면
--    자식테이블의 fk가 변경되는 트리거를 만들어주면 좋다.
-----------------------------------------------------------------------------------------
select * from user_source
where type='TRIGGER' and name='AFTRI_UPD'; -- 유저가 가진 소스를 본다.
-----------------------------------------------------------------------------------------
select * from user_triggers; -- 유저가 가진 트리거에대한 내용을 볼수 있다.
-----------------------------------------------------------------------------------------

Posted by Duritz

공지사항

Yesterday
Today
Total
05-18 14:19

달력

 « |  » 2024.5
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31