데이터베이스 수업 기록
22-11-28 DB마지막 수업 - 트리거
JadeStone
2022. 11. 28. 20:58
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구문은 모르면 안됨. 잘 공부해두기.