728x90

요약

SQL Server 7.0은 데이터를 접근하기 위하여 OLE DB를 사용하며 OLE DB는 다양한 Data Source에 대한 분산 쿼리를 가능하게 합니다. 이 문서는 OLE DB Data Source에 대한 분산 쿼리를 수행하기 위하여 Linked Server 및 기타 환경을 설정하는 방법을 설명합니다.

추가 정보

환경 설정은 SQL 문이나 Enterprise Manager를 사용가능하며 이 자료에서는 SQL 문을 이용하는 방법을 다룹니다.
SQL 문을 이용한 환경 설정:
1. Data Source가 있는 Server를 현재 Login한 SQL Server에 추가합니다.
다음의 구문을 이용하여 추가하며 이 Stored Procedure는 OLE DB Provider의 종류에 따라서 요구하는 Argument가 다르므로 자세한 사용 방법은 Books Online을 참고하십시오.

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

생성하고자 하는 Linked Server 명
[@server =] 'server'
					

Lined Server로 추가하고자하는 OLE DB Data Source의 제품명
[@srvproduct =] 'product_name'
					

OLE DB Provider의 고유한 프로그램 ID(PROGID)
[@provider =] 'provider_name'
					

OLE DB Provider가 이해하는 Data Source 명
[@datasrc =] 'data_source'
					

OLE DB Prodiver가 이해하는 데이터베이스의 위치
[@location =] 'location'
					

OLE DB Provider의 Connection String
[@provstr =] 'provider_string'
					

OLE DB Provider에 연결했을 때 사용되는 Catalog
[@catalog =] 'catalog'
					

예제 1:
USE master
Go
EXEC sp_addlinkedserver'SEOUL', N'SQL Server'
Go
					
위 예제는 SEOUL이라는 SQL Server를 Linked Server로 등록한 것입니다.

예제 2:
USE master
Go
EXEC sp_addlinkedserver  @server = 'DAEJEON',  @srvproduct = 'Oracle',
 @provider = 'MSDAORA',  @datasrc = 'ORADJ'
Go
					
위 예제는 SQL*Net alias가 ORADJ인 Oracle 데이터베이스를 DAEJEON이란 Linked server로 등록한 것입니다.
2. 데이터의 보안을 유지하기 위하여 Local Server와 Linked Server 사이의 Login id를 생성합니다. Local Server에 로그인한 사용자가 Linked Server에 있는 테이블을 접근하기 위하여 분산 Query를 수행하는 경우 내부적으로는 Local Server가 Linked Server로 로그 인하게 됩니다. 이 작업은 Local Server가 Linked Server로 로그인할 때 사용되어 지는 로그인 신임장을 지정하는 것입니다.

Syntax:
sp_addlinkedsrvlogin [@rmtsrvname =] 'rmtsrvname' [,[@useself =] 'useself']
[,[@locallogin =] 'locallogin'] [,[@rmtuser =] 'rmtuser'] [,[@rmtpassword =] 'rmtpassword']
					
Arguments:

Linked Server 이름
[@rmtsrvname =] 'rmtsrvname'

[@useself =] 'useself'
					
값이 TRUE인 경우 Local Server에 로그인한 사용자는 동일한 사용자 이름으로 rmtsrvname에 연결을 하게 되고, False인 경우는 rmtuser와 rmtpassword Argument를 사용하여 rmtsrv에 연결하게 됩니다. 따라서, 값이 TRUE인 경우는 rmtuser와 rmtpasword Argument는 무시됩니다.
[@locallogin =] 'locallogin'
					
Local Server에 로그인한 이름. 디폴트로 NULL이며 NULL은 모든 Local Login에 해당된다는 의미입니다.

rmtsrvname에 연결하기 위하여 사용되는 사용자명
[@rmtuser =] 'rmtuser'
					
rmtuser의 Password
[@rmtpassword =] 'rmtpassword'
					
예제:
EXEC sp_addlinkedsrvlogin 'SEOUL', 'false', NULL, 'DBUser', 'Password'
Go
					
위 예제는 Local Server에 로그인한 모든 사용자가 분산 쿼리를 수행할 수 있으며 이때 Local Server는 DBUser 계정과 Password란 암호로 SEOUL이란 Linked Server에 연결할 수 있음을 의미합니다.

위 본문은 다음 URL에서 가져 왔습니다.

http://support.microsoft.com/default.aspx?scid=kb;ko;601433

728x90
Posted 2006/11/30 14:11 by martian

출처 : http://blog.naver.com/cmsworld7/50006434348
http://www.rainnara.com/zero/zboard.php?id=study&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=33

링크드 서버 등록
--@Server='서버명 (IP 또는 호스트네임)'
--@srvproduct='오라클서버명'
--@provider='서비스공급자 (오라클 : MSDAORA)'
--@datasrc='TNS 명'
declare @sql varchar(1000)
set @sql = ' exec sp_addlinkedserver
@Server=''192.168.1.4'',
@srvproduct=''ORACLE2'',
@provider=''MSDAORA'',
@datasrc=''OCS'''

exec(@sql)

링크드 서버 login 매칭
exec sp_addlinkedsrvlogin
@rmtsrvname='192.168.1.4',
@useself=false,
@locallogin=null,
@rmtuser='system',
@rmtpassword='asdf123'



TNS (LISTENER) 설정

-- 시작 (프로그램)--> Oracle - OraHome92 --> Configuration and Migration Tools
  --> Net Configuration Assistant

-- (리스너 구성)
-- 리스너구성 --> 추가 --> 리스너명 입력 --> TCP --> 표준포트번호(1521)사용
  --> 다른 리스너를 구성하시겠습니까(아니오) --> 완료

-- (로컬네트 서비스 이름구성)
-- 로컬네트 서비스 이름구성 --> 추가 --> Oracle8i 이상 데이타베이스 또는 서비스
  --> 서비스이름입력 (일반적으로 DB명)
-- TCP --> 호스트이름 또는 IP 입력(포트번호 기본) --> 접속테스트수행(로그인매칭) --> 완료


링크드 서버로의 쿼리
select * from openquery([192.168.1.4], 'select * from all_users')
select * from openquery(IRON, 'select * from dba_role_privs')

MS-SQL (tb_physician2) 에 테이블 복사 ---> ORACLE 4자처리 : 대소문자 구분주의 (속도저하)
insert into tb_physician2
select * from [192.168.1.4]..SYSTEM.TB_PHYSICIAN

ORACLE 에 MS-SQL 소속 테이블 복사
insert into [192.168.1.4]..SYSTEM.TB_PHYSICIAN
select * from tb_physician2

MS-SQL (tb_physician2) 에 테이블 복사 ---> openquery 이용
  (속도향상됨 : where 절을 이용할 경우 더욱 향상됨)

insert into tb_physician2
select * from openquery([192.168.1.4], 'select * from tb_physician')

ORACLE -  INSERT
insert openquery([192.168.1.4], 'select * from tb_physician')
values ('OG', '산부인과', 'OG03', '김수찬', '20040901', '29991231', 'Y')

ORACLE - UPDATE
update openquery(IRON, 'select drcd from tb_physician where drcd=''OG01'' ')
set drcd='OG02'

ORACLE - DELETE
delete openquery([192.168.1.4], 'select * from tb_physician')

------------------------------------------------------------------------------------------

LINKED SERVER로 이기종 연결 후 저장프로시저 생성오류가 날 경우

CREATE PROC 구문전에 아래 구문을 먼저 적는다.

SET ANSI_NULLS ON
SET ANSI_WARNINGS ON

GO

CREATE PROC SP_XXX_XXXX
AS
......
......
......

위 구문이 없이 프로시저를 생성하려 하면 다음과 같은 에러메세지가 뜬다.

------------------------------------------------------------------------------------------
오류 7405: 유형이 다른 쿼리를 사용하려면 연결에 대해  ANSI_NULLS 및 ANSI_WARNINGS 옵션을
설정해야 합니다. 이렇게 하면 일관된 방식으로 쿼리를 사용할 수 있습니다. 이 옵션을 설정한 다음
쿼리를 다시 실행하십시오
-------------------------------------------------------------------------------------------


오라클과 MS-SQL 연결 또는 SQL-PLUS 에서 한글이 깨지는 경우

ORACLE 과 NT 서버의 Characterset 을 일치시킨다.

1. NT : regedit --> hkey_local_machine --> software --> oracle --> nls_lang 에서 확인

2. ORACLE : props$ 테이블의 필드를 확인 NLS 관련 세필드의 조합
   - AMERICAN_AMERICA.US7ASCII 형식
   - KOREAN_KOREA.KO16KSC5601 형식

3. 확인 되었으면 두 서버의 Characterset 을 일치시키면 됨
   - NT 의 regedit 에서 찾기를 눌러 ORACLE 소속 NLS_LANG 문자열값을 바꿔준다.
   - 다음찾기를 눌러 계속 바꿔준다 (총 3개)

728x90

/* mssql */
exec sp_addlinkedserver
 @server='Tulip',
 @srvproduct = 'mssql',
 @provider = 'sqloledb',
 @datasrc = 'Tulip',
 @provstr='',
 @catalog=''
go

exec sp_addlinkedsrvlogin 'TUlip', 'false', null, 'sa', '<sqlpass>'
go


/* Oracle */
EXEC sp_addlinkedserver
  @server = 'INSIDER'
  , @srvproduct = 'oracle'
  , @provider = 'MSDAORA'
  , @datasrc = '211.169.***.***'
Go

EXEC sp_addlinkedsrvlogin
  'INSIDER'
  , 'false'
  , NULL
  , 'scott'
  , 'tiger'
Go



/* File Linked */
-- Create File Linked Srv
exec sp_addlinkedserver FileSrv, 'Jet 4.0',
'Microsoft.Jet.OLEDB.4.0',
'c:\',
null,
'Text'

-- Login At File Linked Srv
exec sp_addlinkedsrvlogin FileSrv, false, sa, null

-- Drop File Linked Srv Drop
exec sp_droplinkedsrvlogin 'FileSrv', null
exec sp_dropserver FileSrv

-- Show TxtTable File Linked Srv
exec sp_tables_ex FileSrv



use master
go


-- Linked Server를 등록한다.
EXEC  sp_addlinkedserver   
 @server='SecondInstance'
,  @srvproduct=''
,             @provider='SQLOLEDB'
,  @datasrc='snoopy\second'


-- sp_addlinkedserver의 구성을 살펴보면 Linked Server의 정보가 sysserver 테이블에 있음을 알 수 있다.
exec sp_helptext sp_addlinkedserver


-- 등록이 되었나 확인해보자.
select * from sysservers


-- 등록된 Linked Server에 접속할 수 있는 계정을 만들어야 한다.
EXEC sp_addlinkedsrvlogin 'SecondInstance', 'false', NULL, 'id', 'passwd'

-- sp_addlinkedsrvlogin의 구성을 살펴보면 계정 정보가 sysxlogins 테이블에 있음을 알 수 있다.


exec sp_helptext sp_addlinkedsrvlogin


-- 등록이 되었나 확인해보자.
select * from sysxlogins


-- 이제 등록된 Linked Server에 쿼리를 날려보자.
select * from secondinstance.pubs.dbo.sales


-- 등록된 Linked Server의 정보를 지운다.
EXEC sp_droplinkedsrvlogin 'SecondInstance',NULL


EXEC sp_dropserver 'SecondInstance', 'droplogins'

+ Recent posts