[Database/Oracle] 원격 데이터 베이스 link(연결)객체 생성 + 분산쿼리

minj-j·2022년 8월 1일
0

Oracle

목록 보기
9/13
post-thumbnail

해당 작업을 위해서는 create database link 권한이 필요하다.

create database link [link 객체 이름]
connect to [원격 DB 아이디] identified by [원격 DB 비밀번호]
using '[네트워크 서비스 이름(Net service name)]';

ex)
create database link dw
connect to ldw identified by pass
using 'partner';

그럼 아래와 같은 쿼리로 dw user 내에 있는 emp table을 가져올 수 있다.

select * from emp@[link 객체 이름]
select * from emp@dw

2. Trigger를 이용하여 원격과 로컬 데이터베이스 간에 복제 및 분산쿼리 하기

먼저 기존에 있던 table들은 많은 insert 및 update 명령으로
테이블에 할당 된 버퍼가 모두 찼을 수도 있으니 새로운 table을 하나 만들어 준다.

create table sample(id number(3), name varchar2(10), pay number(10));

대충 이런식으로 trigger용 sample 테이블을 하나 만들어준다.

그 다음 ed [트리거 파일명] 명령으로 테이블 복제 트리거를 하나 만들어 준다.

0. ed copy_table ->trigger를 만들 파일을 생성한다.

1. sample tableinsert가 발생하면 dw컴퓨터 sample table에 같은 행이 insert
create trigger in_sample
  after insert on sample
  for each row
begin
insert into sample@dw values(:new.id, :new.name, :new.pay);
end;
/
--내 계정의 sampel table에 insert가 발생할 시
--내가 insert한 내용과 같은 내용이 insert 될 link객체의 명을
--insert 할 table 뒤에 @[link 객체명] 형태로 넣어 주면 된다.
--ex) insert into sample@dw values(:new.id, :new.name, :new.pay);

2. sample tabledelete가 발생하면 dw컴퓨터 sample table에 같은 행이 delete
create trigger del_sample
  after delete on sample
  for each row
begin
	delete from sample@dw p where p.id=:old.id;
end;
/

3. sample tableupdate가 발생하면 dw컴퓨터 sample table에 같은 행이 update
create trigger up_sample
  after update on sample
  for each row
begin
	delete from sample@dw p where p.id=:old.id;

	insert into sample@dw values(:new.id, :new.name, :new.pay);
end;
/

4. @ [trigger 파일명] ->으로 트리거를 생성한다.

cf) 원래 이거 모두 합쳐 하나의 트리거로 만들 수 있는데
나중에 해보고 확인한 다음에 수정을 해보겠다.

3. 원격 오라클 서버에 있는 프로시저 사용하기

원격 오라클서버에 있는 프로시저를 수행하려면 반드시 OUT 모드가 필요하다.
OUT 모드는 오라클 서버에서 값을 반환해주는 것을 말한다.

원격 오라클 서버에 아래와 같이
사번을 입력하면 이름을 출력해주는 프로시저가 있다고 해보자

-- out 모드가 있는 프로시저
create or replace procedure p_sawon_name
	(v_bun         sawon.sabun%type,
	 v_name out sawon.saname%type) 
     --sawon 테이블에 saname은 v_name을 통해 값이 반환 된다.
is
begin
	select saname into v_name from sawon where sabun=v_bun;
    --입력된 v_bun에 대한 saname이 v_name에 담겨 반환이 된다.
end;
/

프로시저 호출은 이와 같이 한다.

variable name varchar2(100) 
-- OUT 모드로 설정되어진 re에 들어간 값을 보기 위해서는 전역변수 name을 설정 한다.
exec p_sawon_name@dw(16, :name)
-- 사번이 16인 사람의 이름을 보고자 한다.
-- 근데 dw라는 원격 오라클 서버에 있는 프로시저를 가져올 것이기 때문에
-- 프로시저 명 뒤에 @[link객체 명]을 붙여 호출한다.
print name
-- 이름을 출력한다.

결과
NAME
----------
김유신
profile
minj-j`s Development diary!

0개의 댓글