티스토리 뷰

15_PLSQL프로시저_트리거.pdf
0.45MB
04PLSQL트리거.sql
0.00MB

/*
trigger는 테이블에부착한 형태로써, insert, update, delete 작업이 수행될 때
특정 코드가 작동되도록 하는 구문입니다.

트리거는 실행할 때 범위를 지정하고 f5버튼으로 부분 실행해야 합니다.
그렇지 않으면 하나의 구문으로 인식되어 정상동작하지 않습니다.
*/

create table tbl_test(
    id number(10),
    text varchar2(20)
);

--
set SERVEROUTPUT on;
/*
CREATE or REPLACE TRIGGER trg_test
    AFTER update or delete --삭제, 수정 이후에 동작
    on tbl_test            --부착할 테이블
    for each row           --각 행에 적용
DECLARE

BEGIN
    DBMS_OUTPUT.PUT_LINE('트리거가 동작함');
end;
*/
insert into tbl_test values(1, '홍길동');
insert into tbl_test values(2, '이순신');
update tbl_test set text = '홍길동' where id = 1;
delete from tbl_test where id = 2;
-------------------------------------------------------------------------------------
--before vs after
/*
after트리거 - insert, update, delete 작업 이후에 동작하는 트리거를 의미합니다. (이게 더 많이 사용)
before트리거 - insert, update, delete 작업 이전에 동작하는 트리거를 의미합니다.

:OLD = 참조 전 열의 값 (INSERT : 입력 전 자료, UPDATE : 수정 전 자료, DELETE : 삭제할 자료)
:NEW = 참조 후 열의 값 (INSERT : 입력 할 자료, UPDATE : 수정 된 자료)
*/

create table tbl_user_backup(
    id varchar2(20),
    name varchar2(20),
    address varchar2(30),
    updatedate date default sysdate,
    m_type char(10), --변경타입
    m_user varchar2(20) --변경한 사용자
);

create table tbl_user(
    id varchar2(20) primary key,
    name varchar2(20),
    address varchar2(30)
);    

--update나 delete를 시도하면 수정 또는 삭제된 데이터를 별도의 테이블에 보관
create or replace trigger trg_user_backup
    after update or delete
    on tbl_user
    for each row
declare --변수선언
    vn_type varchar2(10);
begin

    if updating then --업데이트 or 딜리트
        vn_type := '수정';
    elsif deleting then
        vn_type := '삭제';
    end if;
    
    --user_backup에 인서트
    insert into tbl_user_backup values(:old.id, :old.name, :old.address, sysdate, vn_type, user()); --:old. 하면 기존에 있던 데이터를 말함. user()은 디비계정사용자 이름을 입력해줌.
    
end;

insert into tbl_user values('test01', 'admin', '서울');
insert into tbl_user values('test02', 'admin', '경기');
insert into tbl_user values('test03', 'admin', '부산');
update tbl_user set address = '부산' where id = 'test01'; --동작
delete from tbl_user where id = 'test02'; --동작

select * from tbl_user_backup;
select * from tbl_user;

--before  : 들어가기 전에 어떤 작업을 해준다.
create or replace trigger trg_user_insert
    before insert
    on tbl_user
    for each row
declare

begin
    :new.name := substr(:new.name,1,1) || '**'; --이렇게 하면 문자열의 제일 앞만 나옴. <입력전 데이터 **붙임>
end;

insert into tbl_user values('test04', 'admin', '부산');
insert into tbl_user values('test05', 'admin', '경기');

select * from tbl_user;

#데이터 베이스 수업을 끝마치면서.

-CREATE, CRUD구문은 모르면 안됨. 잘 공부해두기.

댓글