본문 바로가기

Study/Oracle

[Oracle] DB 링크, 시퀀스, 트리거

디비 링크

인스톨된 오라클1, 오라클2를 .. 연결..

물리적으로 다르게 install 된 2개 이상의 db를 연결..

2개의 connection 으로 하는게 아니라..하나의 connection으로.. 조인 및 기타 쿼리 실행 가능...

스냅샷도 포함이 되는데 잘 쓰이지는 않는다.

 

 

시퀀스

CREATE SEQUENCE NCCJST2011.SQ_BUS_BUS_MST

  START WITH 13201

  MAXVALUE 9999999

  MINVALUE 1

  NOCYCLE

  CACHE 20

  NOORDER;

시퀀스는 자동증가해서 증가한 값을 리턴해줌..

 이름.nexval() 인가.. 하나 증가 시킨 값을 리턴..

nextval()

 

다음 이쿼리는 트리거에 시퀀스를 적용한 예

CREATE OR REPLACE TRIGGER LOCAL.TRG_CATE_INFO_01

  BEFORE INSERT

ON LOCAL.CATE_INFO

REFERENCING NEW AS New OLD AS Old

FOR EACH ROW

DECLARE

 

BEGIN

     :New.cateno := SQ_CATE_INFO_CATENO.nextval;

END TRG_CATE_INFO_01;

/

 

 

이렇게 되면 insert 시 자동 증가하는 필드구성가능...

 

 

트리거

트리거는 해당 테이블이 insert , update, delete 될 경우에 어떤일을 하라라고 정의하는 거라고 보면 된다..

insert , delete , update 시에 공통적으로 해야 될 db 작업을 실행가능..

남용하지 말기 -> 간단한 작업에 유용하다.

백그라운드가 아니라서 속도 저하의 원인이 되기도 한다.

예를 들어 시스템 구성 상 아무 문제 없는데 느리다고 할 경우..

DROP TRIGGER SCOTT.TRG_UPDATE;

 

// 이름 정의

CREATE OR REPLACE TRIGGER  SCOTT.TRG_UPDATE

// INSERT 되기 전에

  BEFORE INSERT ON  SCOTT.TRG_UPDATE2 FOR EACH ROW

BEGIN

// 새로 생기는 ROW에 SEQNO 라는 필드에 시퀀스의 값을 넣으라는 것

// BEGIN 과 END 사이에 쿼리, 프로시져, 펑션도 넣을 수 있음!!

  :new.SeqNo := SQ_TRG_UPDATE2.nextval;

END TRG_UPDATE;

/

 

BEFORE / AFTER / COMPOUND  차이점

트랜잭션의 /후를 나타낸다.

begin ~ end 사이에 문장을 .. update, delete, insert 전에 해라..... 아니면 후에 실행...

COMPOUND는 혼용인데 많이 쓰이지 않는다.

보통은 INSERT, UPDATE는 AFTER를

DELETE는 BEFORE를 많이 쓴다.

 

 

트리거 예제

트리거 활용한다면 apt_info 에 전체 가격이 있다면..

호의 가격이 변동이 될때마다.. apt_info  전체 가격을 update 하는 트리거가 있음 좋을듯..

물론.. ho_info 의 가격이 update, insert 후가 되겠죠...

그렇게 되면 가격이 source 에서 매번 돌리지 않아도.. 자동으로 가격이 동기화 되겠죠..

delete 도 해야 되겠네요..

 

우선 APT_PRICE 담을 필드를 추가

ALTER TABLE APT_INFO ADD (TOTAL_HO_PRICE NUMBER(19, 3) DEFAULT 0);

 

 

CREATE OR REPLACE TRIGGER SCOTT.TRG_UPDATE_APT_PRICE

AFTER INSERT OR UPDATE ON SCOTT.HO_INFO FOR EACH ROW

DISABLE

BEGIN

    UPDATE SCOTT.APT_INFO A SET TOTAL_HO_PRICE =

    (SELECT SUM(H.PRICE) FROM SCOTT.HO_INFO H WHERE A.APT_CODE = H.APT_CODE);

END;

/

 

그러나.. 에러발생..

우선 DISABLE -> 삭제..

그리고 해당 TRIGGER가 데이터 입력 시에나 갱신된 후에 작동을 하므로..

작동하는 동안에는 SUM함수에서 계속 에러가 발생한다.

그래서 다른 방법으로 해결..

 

DROP TRIGGER SCOTT.TRG_UPDATE_APT_PRICE;

 

CREATE OR REPLACE TRIGGER SCOTT.TRG_UPDATE_APT_PRICE

AFTER UPDATE

ON SCOTT.HO_INFO

REFERENCING NEW AS NEW OLD AS OLD

FOR EACH ROW

BEGIN

    UPDATE SCOTT.APT_INFO A

    SET A.TOTAL_HO_PRICE = TOTAL_HO_PRICE - :OLD.PRICE + :NEW.PRICE

    WHERE A.APT_CODE = :OLD.APT_CODE;

END TRG_UPDATE_APT_PRICE;

/

 

들어오는 데이터값에서 기존의 PRICE 값은 삭제하고 새로 들어온 PRICE 값이 변경되므로

APT_PRICE값에 빼주고, 더해준다.