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; -- 유저가 가진 트리거에대한 내용을 볼수 있다.
-----------------------------------------------------------------------------------------
'Program... > Oracle' 카테고리의 다른 글
Materialized View의 생성 (1) | 2009.04.13 |
---|---|
REF CURSOR를 사용해 프로시저에서 여러행을 반환 (0) | 2009.04.02 |
Oracle Procedure (Cursor, for loop Cursor) (0) | 2009.03.14 |
Oracle Procedure (배열) (0) | 2009.03.14 |
Oracle Procedure (loop, for loop) (0) | 2009.03.14 |