본문 바로가기

DB

Maria DB TRIGGER

#트리거
#연달아 사용할때 사용한다.

 

#사용할 테이블 생성
CREATE TABLE testTBL(
id INT ,
txt CHAR(10)
);

 

#값입력
INSERT INTO testtbl VALUES (1, 'aaaa'), (2, 'bbbb'), (3, 'cccc');

 

#트리거 생성

DELIMITER //
CREATE  TRIGGER 트리거이름
(AFTER, BEFORE) #조건
ON 테이블이름  #testtbl테이블에서
FOR EACH ROW  #각행마다 실행시켜라
BEGIN
#트리거 실행 시 작동되는 코드
END //
DELIMITER ;

 

#예제
DELIMITER //
CREATE  TRIGGER testTrg
AFTER DELETE  
ON testtbl 
FOR EACH ROW  
BEGIN
SET @msg= '삭제가 되었어요..';  
END //
DELIMITER ;

 

#트리거 확인하기
SET @msg='';
INSERT INTO testtbl VALUES(4, 'dddd');
SELECT @msg;

UPDATE testtbl SET txt='xxxx' WHERE id=4;
SELECT @msg;

DELETE FROM testtbl WHERE  id=4;
SELECT * FROM testtbl;
SELECT @msg;  #트리거에서 지정한 메시지인 삭제가 되었다는 메시지가 뜸

 

 

 

 

 


#회원테이블에 update나 delete를 시도하면, 수정/삭제된 데이터를 별도의 테이블에 보관하고 

변경된 일자와 변경한 사람을 기록하자.

 

#테이블생성
CREATE  TABLE usertbl(
userID CHAR(8) PRIMARY KEY,
NAME VARCHAR(10) NOT NULL,
birthYear INT NOT NULL,
addr CHAR(2) NOT NULL,
mobile1 CHAR(3),
mobile2 CHAR(8),
height SMALLINT,
mDate DATE
);

 

#테이블 데이터 입력
INSERT INTO usertbl VALUES ('HGD', '홍길동', 1980, '서울', '010', '11112222', 173, '2023-01-23');
SELECT*FROM usertbl;

 

#별도의 테이블 생성
CREATE  TABLE backupUsertbl(
userID CHAR(8) , 
NAME VARCHAR(10) NOT NULL,
birthYear INT NOT NULL,
addr CHAR(2) NOT NULL,
mobile1 CHAR(3),
mobile2 CHAR(8),
height SMALLINT,
mDate DATE,
modType CHAR(2), #변경된 타입(수정 또는 삭제)
modDate DATE, #변경된 날짜
modUser VARCHAR(256) #변경된 사용자
);

 

#예제 업데이트 시 트리거 생성
DELIMITER $$
CREATE TRIGGER backUserTbl_UpdateTrag
AFTER UPDATE ON usertbl FOR EACH ROW
BEGIN
INSERT INTO backUpusertbl VALUES(OLD.userID, OLD.name, OLD.birthYear, OLD.addr, OLD.mobile1,
OLD.mobile2, OLD.height, OLD.mDate, '수정', CURDATE(), CURRENT_USER());
END $$
DELIMITER ;

 

#트리거 확인
UPDATE usertbl SET height = 198 WHERE userID='HGD';
SELECT*FROM usertbl;
SELECT*FROM backupUserTbl;

UPDATE usertbl SET addr = '부산' WHERE userID='HGD';
SELECT*FROM usertbl;
SELECT*FROM backupUserTbl;

 

#예제 삭제 시 트리거 생성
DELIMITER $$
CREATE TRIGGER backUpUserTbl_DeleteTrag
AFTER DELETE ON usertbl FOR EACH ROW 
BEGIN
INSERT INTO backUpusertbl VALUES(OLD.userID, OLD.name, OLD.birthYear, OLD.addr, OLD.mobile1,
OLD.mobile2, OLD.height, OLD.mDate, '삭제', CURDATE(), CURRENT_USER());
END $$
delimiter ;

 

#트리거 확인
DELETE FROM usertbl WHERE userID='HGD';
SELECT*FROM usertbl;
SELECT*FROM backupUserTbl;

 

 

 

 

 

 

 


#예제
#데이터가 테이블에 입력될 때 출생년도를 검사해서 데이터에 문제가 있는지 확인하는 트리거
#값을 변경해서 입력시키는 Before Insert 트리거를 작성해보자.
#출생년도는 1900년 이상이어야 한다.
#출생년도가 현재 년도 보다 크면 현재 년도로 변경한다.

DELIMITER %%
CREATE TRIGGER birthChecktrg
BEFORE INSERT ON usertbl FOR EACH row
BEGIN  
if NEW.birthyear < 1900 then   #데이터가 입력될 때 임시테이블이 있음 new, old
SET NEW.birthYear=0;
ELSEIF NEW.birthyear > YEAR(CURDATE()) then
SET NEW.birthYear=YEAR(CURDATE());
END if;
END %%
DELIMITER ;

#트리거 확인
INSERT INTO usertbl VALUES ('Hdd3', '고길동', 1800, '서울', '010', '11112222', 173, '2023-01-23');
SELECT*FROM usertbl;
UPDATE usertbl SET birthYear =1800 WHERE userID='Hdddddd';
SELECT*FROM usertbl;
SELECT*FROM backupUserTbl;

'DB' 카테고리의 다른 글

Maria DB Transaction 트랜젝션  (0) 2023.12.07
Maria DB SQL PROCRDURE 프로시저  (1) 2023.12.07
Maria DB SQL Stored Function  (0) 2023.12.06
Maria SQL CONSTRAINT  (1) 2023.12.06
Maria DB SELECT용어 정리  (2) 2023.12.05