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;
'IT일반과목 > DataBase' 카테고리의 다른 글
데이터베이스 20180827 (학원16) (0) | 2018.08.27 |
---|---|
데이터베이스 20180827 (학원15) (0) | 2018.08.27 |
데이터베이스 20180824 (학원13) 과제 (0) | 2018.08.24 |
데이터베이스 20180824 (학원12) (0) | 2018.08.24 |
데이터베이스 20180824 (학원11) (0) | 2018.08.24 |