일단 트리거를 쓰는 이유, 고려할점에 대해서 구글링 해본 내용등를 보자 !
활용
1.데이터 무결성의 강화
-전체 데이터베이스에 걸쳐 영향 받은 테이블을 연속적으로 변경함으로서 데이터 무결성을 강화하는데 사용될 수 있다.
- 중복되었거나 파생된 데이터에 대해 트리거를 사용하는 것이 좋다.
2.참조 무결성의 강화
-연속적인 삭제 / 갱신이 일어날 필요가 있을 때 적절한 작업을 하도록 보장하는데 유용하다.
- FOREIGN KEY, REFERENCE 제약을 사용할 수도 있다.
- 자신의 오류 메시지를 정의할 수 있다.
3.업무 규칙의 설정
- 제약에 의해 표현될 수 있는 것보다 복잡한 제약을 표현할 수 있다.
4.감사기능의확장
-상세한 변경 내역을 추적하려면, 트리거를 적용하거나 Log Miner를 이용해 아카이브 로그를 뒤지는 수 밖에 없음
-감사 목적으로 적용되는 트리거는 성능적으로 심각한 부담을 줍니다
고려사항
- 트리거는 각 테이블에 최대 3개까지 존재할 수 있다.
UPDATE, INSERT, DELETE트리거가 각각 하나씩 존재할 수 있다.
이미 트리거가 정의된 작업에 대해 다른 트리거를 정의하면 기존의 것을 대체한다.
- 테이블의 소유자만이 트리거를 생성하거나 삭제할 수 있다.
- 뷰나 임시 테이블을 참조할 수 있으나 뷰나 임시 테이블에 대해 생성할 수 는 없다.
- 데이터 무결성이나 업무 규칙 처리에만 사용하는 것이 좋다.
- 트리거의 동작은 이를 삭제하지 않는 한 계속된다.
- 테이블의 삭제는 관련 트리거의 삭제를 유발한다
추가되어 있던 회원들이 아이디를 변경하면 게시판에도 변경되어야 하니까 트리거를 사용했다 원래는 아이디를 변경하지 않지만 구냥.. 음 해봤다.
TRIGGER(UPDATE)
CREATE [OR REPLACE] TRIGGER 트리거명
BEFORE or AFTER
트리거이벤트 ON 테이블명
[FOR EACH ROW [WHEN TRIGGER 조건]]
[Referencing OLD AS {변경전 값을 참조하는 변수명} NEW AS {변경후 값을 참조하는 변수명}]
DECLARE
선언문
BEGIN
PL/SQL 코드
END;
트리거명 : 자신이 원하는 트리거명
트리거이벤트 : insert,update,delete 중에서 자신이 트리거를 적용하기 원하는 곳( OR을 사용해서 여러개 가능 ex. insert or update )
테이블명 : 트리거를 적용시킬 테이블 명
[FOR EACH ROW [WHEN TRIGGER 조건]]
FOR EACH ROW 를 쓰면 row(행) 트리거를 생성하고 WHEN 조건을 주면 WHEN 조건에 만족하는 ROW(행)만 트리거 적용 가능.
즉,FOR EACH ROW를 안쓰면 statement(문장) 트리거 생성.
[Referencing OLD AS {변경전 값을 참조하는 변수명} NEW AS {변경후 값을 참조하는 변수명}]
row(행)트리거 일때, 트리거에 영향 받는 행들의 값을 참조할때 사용(statement(문장) 트리거에는 사용 못함).
{변경전 값을 참조하는 변수명} ,{변경후 값을 참조하는 변수명} 의 기본 변수명
:OLD = 참조 전 열의 값 (INSERT : 입력 전 자료, UPDATE : 수정 전 자료, DELETE : 삭제할 자료)
:NEW = 참조 후 열의 값 (INSERT : 입력 할 자료, UPDATE : 수정할 자료)
위에 구문을 보고 트리거를 작성해보면 오류가 난다.. ㅠ
create or replace TRIGGER MEMBER_UPDATE
AFTER UPDATE
ON TBL_MEMBER
FOR EACH ROW
BEGIN
dbms_output.put_line('회원정보가 수정 됩니다.');
UPDATE TBL_BOARD
SET MEMBER_WRITER=:NEW.MEMBER_NAME
WHERE MEMBER_WRITER=:OLD.MEMBER_NAME;
UPDATE TBL_BOARD_RE
SET RE_WRITER=:NEW.MEMBER_NAME
WHERE RE_WRITER=:OLD.MEMBER_NAME;
UPDATE TBL_CUSTOMER_MANAGER
SET CUSTOMER_MEMBER_NAME=:NEW.CUSTOMER_MEMBER_NAME,
CUSTOMER_MEMBER_PASSWORD=:NEW.CUSTOMER_MEMBER_PASSWORD,
CUSTOMER_MEMBER_ROLE=:NEW.CUSTOMER_MEMBER_ROLE,
CUSTOMER_MEMBER_EMAIL=:NEW.CUSTOMER_MEMBER_EMAIL,
CUSTOMER_MEMBER_ADDRES=:NEW.CUSTOMER_MEMBER_ADDRES
WHERE CUSTOMER_MEMBER_NAME=:OLD.CUSTOMER_MEMBER_NAME;
END;
잘못된 바인드 변수 라고 나온다.. 분명히 테이블에 컬럼이 있는데..ㅠㅠ 왜 자꾸 그러니.. 어디가 문제인거니.... 그래서 결국 다시 검색을 해보쟈규.. 구글링 하가 UPDATE OF 를 봤다 그래서 변경되는 컬럼을 작성해주고 그 컬럼을 UPDATE에 작성해봤다.
create or replace TRIGGER MEMBER_UPDATE
AFTER UPDATE OF MEMBER_NAME,MEMBER_PASSWORD,MEMBER_ROLE,MEMBER_EMAIL,MEMBER_ADDRES
ON TBL_MEMBER
FOR EACH ROW
BEGIN
dbms_output.put_line('회원정보가 수정 됩니다.');
UPDATE TBL_BOARD
SET MEMBER_WRITER=:NEW.MEMBER_NAME
WHERE MEMBER_WRITER=:OLD.MEMBER_NAME;
UPDATE TBL_BOARD_RE
SET RE_WRITER=:NEW.MEMBER_NAME
WHERE RE_WRITER=:OLD.MEMBER_NAME;
UPDATE TBL_CUSTOMER_MANAGER
SET CUSTOMER_MEMBER_NAME=:NEW.MEMBER_NAME,
CUSTOMER_MEMBER_PASSWORD=:NEW.MEMBER_PASSWORD,
CUSTOMER_MEMBER_ROLE=:NEW.MEMBER_ROLE,
CUSTOMER_MEMBER_EMAIL=:NEW.MEMBER_EMAIL,
CUSTOMER_MEMBER_ADDRES=:NEW.MEMBER_ADDRES
WHERE CUSTOMER_MEMBER_NAME=:OLD.MEMBER_NAME;
END;
이렇게 하면 오류가 없다 구문을 설명하면 멤버에서 아이디,비밀번호.권한.주소 가 변경될때 게시판과 댓글에 적성된 아이디가 변경되고
어드민 테이블에는 모두가 변경될수 있도록 했다 구글링 보면 이런경우가 없던데.. 내가 잘못찾은건가?.. 오잉??.. 결국 찾아서 하긴했는데 찜찜하다 ㅜ
SELECT * FROM TBL_MEMBER;
SELECT * FROM TBL_BOARD;
SELECT * FROM TBL_BOARD_RE;
SELECT * FROM TBL_CUSTOMER_MANAGER;
UPDATE TBL_MEMBER
SET MEMBER_NAME ='member5'
WHERE MEMBER_NAME='member2';
일단 현재 테이블에 member2라는 데이터가 있다
업데이트를 통해 수정된 데이터를 한번 보자 결과를 보면 'member5' 로 수정되어야 한다
오? 깔끔하게 됬당
TRIGGER(INSERT)
인서트도 다를거 없다 한번보자
CREATE OR REPLACE TRIGGER CUSTOMER_INSERT
AFTER INSERT
ON TBL_MEMBER
FOR EACH ROW
BEGIN
INSERT INTO TBL_CUSTOMER_MANAGER
(CUSTOMER_MEMBER_NAME,
CUSTOMER_MEMBER_PASSWORD,
CUSTOMER_MEMBER_ROLE,
CUSTOMER_MEMBER_EMAIL,
CUSTOMER_MEMBER_ADDRES,
CUSTOMER_MEMBER_AGE)
VALUES
(:NEW.MEMBER_NAME,
:NEW.MEMBER_PASSWORD,
:NEW.MEMBER_ROLE,
:NEW.MEMBER_EMAIL,
:NEW.MEMBER_ADDRES,
:NEW.MEMBER_AGE);
END;
구문을 설명하자면 TBL_MEMBER가 추가 되면 admin 테이블에도 추가될수 있도록 추가 했다 여기서 TBL_CUSTOMER_MANAGER의 컬럼값이 아니라 TBL_MEMBER 컬럼값을 작성해야 한다. 처음에는 TBL_CUSTOMER_MANAGER 컬럼값을 넣고 왜 안되냐고.. 하면서 시간을 보냈다
데이터를 확인해보자
INSERT INTO TBL_MEMBER VALUES('member2','1','ROLE_USER','SDF@SDF.COM','DF','1999',SYSDATE);
TBL_MEMBER 테이블에 멤버를 인서트 해보자
멤버2가 추가되었다. 그러면 트리거 실행됐을까?
확인해보자
오? 정상 이다!
'DB' 카테고리의 다른 글
Oracle (index) (0) | 2020.12.21 |
---|---|
오라클 View (0) | 2020.12.21 |
Oracle(프로시저) (0) | 2020.12.10 |
Oracle(테이블 생성,제약조건,시퀀스) (0) | 2020.12.10 |
Oracle(Join ) 유형 및 구분 (0) | 2020.12.01 |