본문 바로가기

IT일반과목/DataBase

데이터베이스 20180827 (학원14)

2018-08-27

TRIGGER

-> 데이터베이스가 미리 정해놓은 조건을 만족하거나 어떠한 동작이

수행되면 자동적으로 수행되는 행동

홈페이지에 회원을 가입 -> 회원탈퇴 -> 탈뢰한회원 테이블이 따로 

존재합니다.

-> 회원테이블에서는 삭제 -> 탈퇴테이블 추가 ->삭제 쿼리->추가쿼리

->회원테이블에서 삭제 -> 탈퇴테이블에 추가

->트리거의 사전적의미 :연쇄반응

-> 테이블이나 뷰가 INSERT, UPDATE, DELETE 등의 DML문에 의해

데이터가 입력, 수정, 삭제 될 경우에 자동적으로 실행


@트리거의 실행 시점

 -> 이벤트 전 (BEFORE)이나 이벤트 후 (AFTER)로 지정하여 설정

@트리거의 이벤트

 -> 사용자가 DML문을 실행했을 때

@트리거의 유형

 -> FOR EACH ROW에 의해서 문장레벨트리거, 행레벨트리거로 나뉨

 -> FOR EACH ROW가 생략되면 "문장레벨트리거"

 -> FOR EACH ROW가 정의되면 "행레벨 트리거"

 -> 문장 레벨 트리거는 어떤 사용자가 트리거에 설정 되어있는 테이블에 대해서

DML(INSERT, UPDATE, DELETE)문을 실행시킬 때 트리거를 한번 발생시킴

 -> 행 레벨 트리거는 DML에 의해서 여러개의 행이 변경되면 각 행이 변경될때마다 트리거를 발

생시킴 (예를 들어 5개의 행이 변경되면 5번의 트리거가 발생함)


@ 트리거의 조건

 -> 트리거의 조건은 행 레벨 트리거에서만 설정할 수 있으며, 트리거이벤트에 정의된 테이블에 


이벤트가 발생할때 구체적인 데이터 검색조건을 부여할때 사용함.



<바인드 변수>

 - FOR EACH ROW를 사용해야함(행레벨트리거)

: OLD.컬럼명 -> SQL 반영 전의 컬럼 데이터

: NEW.컬럼명 -> SQL 반영 후의 컬럼 데이터


DELETE의 경우는 삭제이기 때문에 OLD만 사용이 가능




----------------------------------------------------------------------------------------------------
































































실행코드


--20180827


/*

TRIGGER

-> 데이터베이스가 미리 정해놓은 조건을 만족하거나 어떠한 동작이

수행되면 자동적으로 수행되는 행동

홈페이지에 회원을 가입 -> 회원탈퇴 -> 탈뢰한회원 테이블이 따로 

존재합니다.

-> 회원테이블에서는 삭제 -> 탈퇴테이블 추가 ->삭제 쿼리->추가쿼리

->회원테이블에서 삭제 -> 탈퇴테이블에 추가

->트리거의 사전적의미 :연쇄반응

-> 테이블이나 뷰가 INSERT, UPDATE, DELETE 등의 DML문에 의해

데이터가 입력, 수정, 삭제 될 경우에 자동적으로 실행


@트리거의 실행 시점

-> 이벤트 전 (BEFORE)이나 이벤트 후 (AFTER)로 지정하여 설정

@트리거의 이벤트

-> 사용자가 DML문을 실행했을 때

*/



CREATE TABLE M_TBL(

USERID VARCHAR2 (20) PRIMARY key,

USERPWD VARCHAR2 (20) NOT NULL,

USERNAME VARCHAR2(20) NOT NULL,

ENROLL_DATE DATE

);


CREATE TABLE DEL_M_TBL(

USERID VARCHAR2(20) PRIMARY KEY,

USERNAME VARCHAR2 (20),

ENROLL_DATE DATE,

OUT_DATE DATE

);


INSERT INTO M_TBL VALUES('jg7180','1234','종규',sysdate);

INSERT INTO M_TBL VALUES('jg7181','1235','종규',sysdate);

INSERT INTO M_TBL VALUES('jg7182','1236','종규',sysdate);

INSERT INTO M_TBL VALUES('jg7183','1237','종규',sysdate);


select * from M_TBL;


select * from del_m_tbL;



COMMIT;


CREATE OR REPLACE TRIGGER M_TBL_TRG

AFTER DELETE 

ON M_TBL

FOR EACH ROW

BEGIN

INSERT INTO DEL_M_TBL VALUES

(:OLD.USERID, :OLD.USERNAME, :OLD.ENROLL_DATE,SYSDATE);

END;--트리거실행이 끝났다는것

--이렇게 해줄경우 다 잘된다.


--delete하고나서 실행될것을 쓰겠다.



/

select * from M_TBL;


select * from del_m_tbl;


delete from m_tbl where userid='jg7182'




select * from M_TBL;


select * from del_m_tbl;




---------------------------------------------------------------------------------------------------------------------------


/

CREATE OR REPLACE TRIGGER M_TBL_INSERT_TRG

AFTER INSERT

ON M_TBL

FOR EACH ROW

BEGIN

DBMS_OUTPUT.PUT_LINE(:NEW.USERNAME || '님이 신규가입하셨습니다.');

--자바에서 System.out.println 이라고 생각하면 된다.

END;

/

SET SERVEROUTPUT ON;

--INSERT라는것에 가입이 되면 회원가입되었다고 뜨는 것이다. 

--자바의 sysout와 같다고 생각하면 된다.

--new.username을 쓰고 가입을 써주는 것이다.

INSERT INTO M_TBL VALUES('user05','pass05','김종규',sysdate);

COMMIT;


----------------------------------------------------

--M_TBL에서 회원정보변경시 (이름 변경시 LOG_TBL에 기록남기기)

CREATE TABLE LOG_TBL(

USERID VARCHAR2 (20),

CONTENT VARCHAR2 (2000),

MODIFY_DATE DATE

);

/

-------------------------------------

/

CREATE OR REPLACE TRIGGER M_TBL_MODIFY_TRG

AFTER UPDATE

ON M_TBL

FOR EACH ROW

BEGIN INSERT INTO LOG_TBL VALUES

(:OLD.USERID, :OLD.USERNAME || '->' || :NEW.USERNAME,SYSDATE);

END;

/


select * from M_TBL;


UPDATE M_TBL SET USERNAME='홍길동' where USERID='user05';

select * from M_TBL;


select * from LOG_TBL;



commit;