WorkaHolic/ORACLE

서로다른 서버에 있는 테이블을 조인할수 있을까요?

2010. 4. 8. 22:38
반응형

아래는 ORACLE을 링크드 서버로 설정하는 법과 쿼리법입니다.
@datasrc에는 오라클 연결시 사용하시는 TNS명을 입력하시면됩니다.
기타 오라클이 아닌 다른 서버로의 연결시 @srvproduct와 @provider를
해당 서버에 맞게 변경하셔주시면 됩니다.

-- 링크드 서버 등록
declare @sql varchar(1000)
set @sql = ' exec sp_addlinkedserver
@Server=''LinkedServer'',
@srvproduct=''ORACLE'',
@provider=''MSDAORA'',
@datasrc=''TNS명'''

exec(@sql)

-- 링크드 서버 login 매칭
exec sp_addlinkedsrvlogin
@rmtsrvname='LinkedServer',
@useself=false,
@locallogin=null,
@rmtuser='userid',
@rmtpassword='userpwd'

-- 링크드 서버로의 쿼리
select * from openquery(LinkedServer, 'select * from test')


-------------------------------------------------------------------------------------------------------
부가설명
-------------------------------------------------------------------------------------------------------
링크드서버와 리모트서버의 차이는

openquery를 사용하느냐???
openrowset을 사용하느냐의 차이입니다.

linkedserver의 경우 위의것을
remoteserver의 경우 아래의 것을 사용합니다.
(제가 잘못알고 있다면 강력 태클을~~~ ^^)

EM에서 보시면 linked server 와 remote server 가 따로 있져~

아래는 openquery와 openrowset의 차이점과 사용법입니다.

openquery를 사용하는 경우

OPENROWSET 함수는 쿼리에서 액세스하려고 하는 리모트 데이터 소스의 연결
방식을 그때 그때 지정하여
사용할 수 있게 해준다. 그러므로 OPENROWSET 함수를 사용한 분산 쿼리는
쿼리에서 필요에 따라 즉흥적으로
다양한 데이터 소스를 다양한 설정으로 연결해서 처리할 수 있다.
참고로OPENROWSET 함수에서 사용하는
쿼리는 모두 해당 리모트 데이터 소스에서 처리된다.

Linked Server를 사용하는 경우

Linked server는 쿼리에서 자주 사용하는 데이터 소스에 대해서 어떤 설정으로
어떻게 연결해서 사용할
것이라는 것을 미리 로컬 SQL 서버에 등록해놓은 것이다.
이것은 OPENROWSET 함수를 사용한 분산 데이터 액세스 방식이 고정적으로 특정
데이터 소스를 계속 사용하는 경우에 발생하는 불편함을 해소해주는 것으로
linked-server-name.dbname.owner.object-name형식으로 분산된 데이터 소스의
오브텍트를 참조할 수 있게
해주어서 하나의 쿼리에서 여러 데이터 소스를 join할 때나 서브 쿼리를 사용할
때도 분산된 데이터 소스를
간편하게 참조할 수 있게 해준다.
Linked Server를 사용하는 분산 쿼리는
다시 쿼리에서 Linked Server를 직접 참조하는 방식과 OPENQUERY 함수를 사용하는
방식으로 나눌 수 있다.
Linked Server를 직접 참조하는 방식의 쿼리는
해당 쿼리의 처리를 로컬 SQL 서버에서 하며
OPENQUERY 함수를 사용하는 방식은
OPENROWSET 함수를 사용할 때와 마찬가지로 해당 리모트 데이터 소스에서 관련된
쿼리의 처리를 하게 된다.
즉, OPENQUERY는 링크드 서버 환경이 설정된 상황에서 질의에 관련된 모든 작업을
로컬 서버는 전혀 처리하지
않고 원격 서버에서 처리하고 결과만 가져오는 방식으로 처리된다.(Linked
Server에서 자기가 관리하는
오브젝트를 엑세스하는 쿼리에 대한 처리는 직접 하도록 하는 pass-through
query를 만들 수 있다.

원격 서버와 관련된 정보 얻기

원격 서버의 정보 얻는 프로시저
sp_linkedservers  링크드 서버로 등록된 서버들에 대한 정보
sp_catalogs       원격 서버의 캐털로그(db정보) 정보
sp_indexes        원격 테이블에 대한 인덱스 정보
sp_primarykeys    기본키 정보
sp_foreignkeys    참조키 정보
sp_tables_ex      원격 db의 테이블 정보
sp_columns_ex     컬럼 정보

Linked Server설정

리모트 OLE DB데이터 소스를 어떤 설정과 연결을 통해서 사용할 것이라는 것을
로컬 SQL서버에 등록

1. Linked Server 세팅방법

sp_addlinkedserver [@server =] 'server' [, [@srvproduct =] 'product_name']
     [, [@provider =] 'provider_name'] [, [@datasrc =] 'data_source']
     [, [@location =] 'location'] [, [@provstr =] 'provider_string']
     [, [@catalog =] 'catalog']


ex) EXEC sp_addlinkedserver @server = 'LONDON Mktg',
        @srvproduct = 'Oracle',
        @provider = 'MSDAORA',
        @datasrc = 'MyServer'

Linked Server 사용방법 및 구현 예제

   1) openquery 사용시
select * from openquery(asptomorrow,'select count(*) from
conspay..테이블명')

   2) linked server 쿼리사용시
select count(*) from shtest.pubs.dbo.tb_name




OPENROWSET을 사용하여 SQL Server Query Analyzer에서 ORACLE DB 연결하기


Syntax
OPENROWSET('provider_name', 'datasource';'user_id';'passwd' |
'provider_string',
                        [catalog.][schema.]object | 'query')

--Remote SQL SERVER를 사용하는 경우

SELECT *
FROM OPENROWSET('SQLOLEDB','SERVERNAME';'userid';'pwd','pubs.dbo.titles')

SELECT *
FROM OPENROWSET('MSDASQL',
'DRIVER={SQL Server};SERVER=SERVERNAME;UID=sa;PWD=;','select * from
pubs.dbo.titles')


--OLEDB 사용
select * from openrowset('MSDAORA','pdss';'asptomortow';'astomorrow',
'select emp_no,sdeptno from 테이블명')

--ODBC DSN 사용
select * from
openrowset('MSDASQL','DSN=asptomorrow;UID=asptomorrow;PWD=asptomorrow;',
'select empno,sdeptnm from pmastest')

--ODBC provider 사용
select * from openrowset('MSDASQL','DRIVER={Microsoft ODBC for
oracle};SERVER=asptomorrow;UID=asptomorrow;PWD=asptomorrow;',
'select emp_no,sdeptno from 테이블')

[출처] 부가설명|작성자 진카자마

반응형