[Oracle]다른 DB SELECT 하기
2개의 서버 구성
---------
서버1
---------
IP : 1.1.1.1
SERVICE_NAME : ORCL
PORT : 1521
DB 접속 계정 : VFXX
DB 접속 PW : VFXX
테이블 : EMP_VFXX
---------
서버2 : 유저 2개 구성
---------
IP : 2.2.2.2
SERVICE_NAME : ORCL
PORT : 1521
DB 접속 계정 : VFXX1
DB 접속 PW : VFXX1
테이블 : EMP_VFXX1
DB 접속 계정 : VFXX2
DB 접속 PW : VFXX2
테이블 : EMP_VFXX2
-------------------
서버 1 DBLINK 구성
: 접속상태 : 서버1 / VFXX
-------------------
DBLINK 생성
CREATE DATABASE LINK "DBLINK_서버2"
CONNECT TO VFXX1
IDENTIFIED BY "VFXX1"
USING '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 2.2.2.2)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORCL)))';
-----------
참고로 쓰는 SELECT 문
: 접속상태 : 서버2 / VFXX1
-----------
접속 계정 VFXX1
DB 툴에서 테이블 가지고 올때 보면
SELECT *
FROM VFXX1.EMP_VFXX1
로 뜬다.
보통 SELECT * FROM EMP_VFXX1: 내가 VFXX1 로 접속했기 때문에, VFXX1. 이라는 부분을 생략한거다.
정식은 SELECT * FROM VFXX1.EMP_VFXX1 가 맞다는 거겠지...
-----------
서버1 에서 서버2의 테이블 SELECT
: 접속상태 : 서버1 / VFXX
-----------
SELECT * FROM VFXX1.EMP_VFXX1@DBLINK_서버2
DBLINK 로 SELECT 할때 @DBLINK명 으로 테이블 명을 쓰면 된다.
이것은 함수, 프로시저에도 적용된다
SELECT FUNCTION_VFXX@DBLINK명 ( 변수, 변수, 변수) FROM DUAL;
BEGIN
PROCEDURE_VFXX@DBLINK명( 변수, 변수, 변수);
END;
DBLINK_서버2 는 생성할때 CONNECT TO "VFXX1" 로 연결하였다. [ 서버 1 DBLINK 구성 참조 ]
그래서 DBLINK_서버2 는 VFXX1 계정에 존재하는 모든 테이블, 함수, 프로시저 등에 권한을 가진다.
-----------
VFXX1 에서 VFXX2 테이블 SELECT
: 접속상태 : 서버2 / VFXX1
-----------
================================
방법1. 테이블 명 직접 선택
: 접속 변경 : 서버2 / VFXX2
-- SELECT 권한 부여 ==> GRANT 관련된건 다른 자료 찾아볼것
-- TABLE 에 SELECT, INSERT, UPDATE, DELETE 권한에 따라 다른 계정에서 처리 가능 권한이 변경됨
-- 사용법 : GRANT "권한" ON "부여될 OBJECT" TO "권한을 받을 계정";
GRANT SELECT ON EMP_VFXX2 TO VFXX1;
: 접속 변경 : 서버2 / VFXX1
SELECT * FROM VFXX2.EMP_VFXX2;
-- 설명했듯이 VFXX2 라는 테이블 소유자 명칭을 작성해 준다.
-- 함수, 프로시저에도 해당한다.
-- SELECT VFXX2.FUNCTION_VFXX2( 변수, 변수, 변수) FROM DUAL;
================================
================================
방법2. 동의어 사용
: 접속 변경 : 서버2 / VFXX2
GRANT SELECT ON VFXX2.EMP_VFXX2 TO VFXX1;
CREATE SYNONYM VFXX1.EMP_VFXX2 FOR VFXX2.EMP_VFXX2;
-- 동의어 생성 관련 따로 자료 찾아 볼것.
-- CREATE SYNONYM "생성될OBJECT의사용자"."생성될OBJECT의명" FOR "원본의사용자"."원본의OBJECT명"
-- FOR 뒷부분은 정확히 명시
-- CREATE SYNONYM VFXX1.VFXX2의테이블입니다 FOR VFXX2.EMP_VFXX2 도 가능
-- VFXX1 의 오브젝트 명은 사용하기 편한 방식으로 변경하여 사용 가능함.
--
응용하자면 CREATE SYNONYM VFXX1.직원테이블 FOR VFXX1.EMP_VFXX1 처럼
같은 사용자 내에서 테이블 명을 변경해서 사용하는것도 가능은 함.
: 접속 변경 : 서버2 / VFXX1
SELECT * FROM EMP_VFXX2;
--> 동의어로 생성했기 때문에, 테이블 명 그대로 사용 가능.
================================