programing

SQL 서버의 서로 다른 두 서버에서 데이터 선택

topblog 2023. 4. 8. 07:51
반응형

SQL 서버의 서로 다른 두 서버에서 데이터 선택

SQL Server의 서로 다른 두 서버에 있는 두 개의 다른 데이터베이스에서 동일한 쿼리로 데이터를 선택하려면 어떻게 해야 합니까?

찾고 있는 것은 Linked Servers입니다.SSMS에서는 오브젝트익스플로러의 트리의 다음 위치에서 액세스 할 수 있습니다.

Server Objects-->Linked Servers

또는 sp_addlinkedserver를 사용할 수 있습니다.

하나만 설정하면 됩니다.이것을 취득하면, 다음과 같이 다른 서버의 테이블을 호출할 수 있습니다.

select
    *
from
    LocalTable,
    [OtherServerName].[OtherDB].[dbo].[OtherTable]

이 항상 그렇지는 하십시오.dbo사용하는 스키마로 치환해 주세요.

Linked Server를 사용하여 수행할 수 있습니다.

일반적으로 링크된 서버는 데이터베이스 엔진이 SQL Server의 다른 인스턴스 또는 Oracle과 같은 다른 데이터베이스 제품의 테이블을 포함하는 Transact-SQL 문을 실행할 수 있도록 구성됩니다.Microsoft Access 및 Excel을 포함하여 많은 유형의 OLE DB 데이터 원본을 연결된 서버로 구성할 수 있습니다.

링크된 서버에는 다음과 같은 이점이 있습니다.

  • SQL Server 외부에서 데이터에 액세스하는 기능.
  • 기업 전체에서 이종 데이터 소스에 대해 분산 쿼리, 업데이트, 명령 및 트랜잭션을 실행할 수 있습니다.
  • 다양한 데이터 소스를 비슷하게 다루는 능력.

Linked Servers에 대한 자세한 내용은 여기를 참조하십시오.

Linked Server를 작성하려면 다음 절차를 수행합니다.

  1. 서버 오브젝트 -> 링크된 서버 -> 새로운 링크된 서버

  2. 리모트 서버명을 지정합니다.

  3. 원격 서버 유형(SQL Server 또는 기타)을 선택합니다.

  4. [보안] -> [이 보안 콘텍스트를 사용하여 작성]를 선택하고 리모트서버의 로그인과 패스워드를 입력합니다.

  5. [확인]을 클릭하면 완료!!

다음은 링크된 서버를 작성하기 위한 간단한 튜토리얼입니다.

또는

쿼리를 사용하여 연결된 서버를 추가할 수 있습니다.

구문:

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

sp_addlinked 서버에 대한 자세한 내용은 이쪽.

링크된 서버를 한 만 생성해야 합니다.링크된 서버를 작성한 후 다음과 같이 조회할 수 있습니다.

select * from LinkedServerName.DatabaseName.OwnerName.TableName
SELECT
        *
FROM
        [SERVER2NAME].[THEDB].[THEOWNER].[THETABLE]

Linked Servers를 사용하는 방법도 확인할 수 있습니다.링크된 서버는 DB2 플랫폼과 같은 다른 유형의 데이터 소스일 수도 있습니다.이것은 SQL Server TSQL 또는 Sproc 호출에서 DB2에 액세스하기 위한 한 가지 방법입니다.

2개의 서로 다른 데이터베이스에 대한 쿼리는 분산 쿼리입니다.다음은 몇 가지 기술과 장단점을 나열한 목록입니다.

  1. 링크된 서버: SQL Server 레플리케이션보다 다양한 데이터 소스에 대한 접근을 제공합니다.
  2. 링크된 서버: 레플리케이션이 지원하지 않거나 애드혹 액세스가 필요한 데이터 소스와 연결
  3. 링크 서버: OPENDATASOURCE 또는 OPENROWSET보다 뛰어난 퍼포먼스
  4. OPENDATASOURCEOPENROWSET 기능:데이터 소스에서 데이터를 임시로 검색할 때 편리합니다.OPENROWSET에는 BULK 패실리티가 있어 포맷파일이 필요하거나 필요 없는 경우도 있습니다.
  5. OPENQUERY: 변수를 지원하지 않습니다.
  6. 모두 T-SQL 솔루션입니다.비교적 구현 및 셋업이 용이함
  7. 모두 소스와 타깃 간의 접속에 의존하여 퍼포먼스와 scalability에 영향을 줄 수 있습니다.

이것들은 모두 훌륭한 답이지만, 이것은 누락되어 있고, 그것만의 강력한 용도가 있습니다.OP가 원하는 것과 맞지 않을 수도 있지만, 질문이 모호해서 다른 사람들이 여기로 오는 길을 찾을 수 있을 것 같습니다.기본적으로 하나의 창을 사용하여 여러 서버에 대해 쿼리를 동시에 실행할 수 있습니다.다음 방법은 다음과 같습니다.

SSMS에서 Registered Servers를 열고 Local Server Groups 아래에 새 서버 그룹을 만듭니다.

이 그룹 아래에서 쿼리할 각 서버에 대해 새 서버 등록을 작성합니다.DB 이름이 다를 경우 속성에서 각각에 대해 기본값을 설정하십시오.

첫 번째 단계에서 만든 그룹으로 돌아가서 마우스 오른쪽 버튼을 클릭하고 New Query를 선택합니다.새 쿼리 창이 열리고 그룹 내 각 서버에서 실행된 쿼리가 실행됩니다.결과는 레코드가 어떤 서버에서 왔는지 나타내는 추가 열 이름과 함께 단일 데이터 세트에 표시됩니다.상태 표시줄을 사용하면 서버 이름이 여러 개로 바뀝니다.

이것을 시험해 보세요.

SELECT * FROM OPENROWSET('SQLNCLI', 'Server=YOUR SERVER;Trusted_Connection=yes;','SELECT * FROM Table1') AS a
UNION
SELECT * FROM OPENROWSET('SQLNCLI', 'Server=ANOTHER SERVER;Trusted_Connection=yes;','SELECT * FROM Table1') AS a

SQL_server 2008을 리모트서버에서 호스트되는 SQL_server 2016에 접속할 때도 같은 문제가 있었습니다.다른 대답들은 나에게 직설적이지 않았다.제가 수정한 솔루션이 다른 사람에게 유용할 수 있다고 생각하여 여기에 씁니다.

원격 IP DB 연결에 대한 확장 응답:

순서 1: 서버 링크

EXEC sp_addlinkedserver @server='SRV_NAME',
   @srvproduct=N'',
   @provider=N'SQLNCLI',   
   @datasrc=N'aaa.bbb.ccc.ddd';
   
EXEC sp_addlinkedsrvlogin 'SRV_NAME', 'false', NULL, 'your_remote_db_login_user', 'your_remote_db_login_password'

서...어디에SRV_NAME발명된 이름입니다.쿼리에서 리모트서버를 참조하기 위해서 사용합니다. aaa.bbb.ccc.ddd는 SQL Server DB를 호스트하는 리모트서버의 IP 주소입니다.

2단계: 쿼리 실행 예:

SELECT * FROM [SRV_NAME].your_remote_db_name.dbo.your_table

...바로 그거야!

구문 상세: sp_addlinkedserversp_addlinkedsrvlogin

Server 2008:

SSMS에서 server1에 접속되어 있는 경우.DB1 및 시도:

SELECT  * FROM
[server2].[DB2].[dbo].[table1]

다른 사용자가 지적한 바와 같이, 작동하지 않는 것은 서버가 연결되어 있지 않으면 서버가 연결되어 있지 않기 때문입니다.

다음과 같은 에러가 표시됩니다.

sys.servers에서 서버 DB2를 찾을 수 없습니다.올바른 서버명이 지정되어 있는 것을 확인합니다.필요에 따라 저장 프로시저 sp_addlinkedserver를 실행하여 서버를 sys.servers에 추가합니다.

서버를 추가하려면:

참조:sp_addlinkedserver Link [1]를 사용하여 서버를 추가하려면 sp_addlinkedserver를 사용합니다.

sys.servers에 무엇이 있는지 확인하려면 다음 절차를 따릅니다.

SELECT * FROM [sys].[servers]

링크된 서버 추가를 위한 간단한 솔루션

첫 번째 서버

EXEC sp_addlinkedserver @server='ip,port\instancename'

두 번째 로그인

EXEC sp_addlinkedsrvlogin 'ip,port\instancename', 'false', NULL, 'remote_db_loginname', 'remote_db_pass'

로컬 DB에 연결된 에서 쿼리 실행

INSERT INTO Tbl (Col1, Col2, Col3)
SELECT Col1, Col2, Col3
FROM [ip,port\instancename].[linkedDBName].[linkedTblSchema].[linkedTblName]

하나의 서버에서 다른 서버로 Linked Server 정의를 작성한 후(이를 위해 SA가 필요), 4부분의 이름을 사용하여 참조합니다(BOL 참조).

 select * 
 from [ServerName(IP)].[DatabaseName].[dbo].[TableName]

@Super9이 데이터 프로바이더 SQLOLEDB와 SQL Server 인증을 사용하는 OPENDATASOURCE에 대해 설명한 바와 같이, 현재 코드가 실행되고 있는 서버 데이터베이스와 다른 서버 '192.166.41.123'에 한 테이블의 코드 조각이 있습니다.

SELECT top 2 * from dbo.tblHamdoonSoft  tbl1 inner JOIN  
OpenDataSource('SQLOLEDB','Data Source=192.166.41.123;User ID=sa;Password=hamdoonsoft')
.[TestDatabase].[dbo].[tblHamdoonSoft1] tbl2 on tbl1.id = tbl2.id

오래된 질문인 건 알지만 동의어를 사용합니다.쿼리는 데이터베이스 서버 A 내에서 실행되며 서버 A에 존재하지 않는 데이터베이스 서버 B 내의 테이블을 찾습니다.그런 다음 서버 B에서 테이블을 호출하는 동의어를 A 데이터베이스에 추가합니다.쿼리는 스키마나 다른 데이터베이스 이름을 포함할 필요가 없습니다.평소대로 테이블 이름을 호출하면 작동합니다.

speak당 동의어는 일종의 링크이므로 서버를 링크할 필요가 없습니다.

sp_addlinkedserver('servername')

그래서 이렇게 될 거예요.

select * from table1
unionall
select * from [server1].[database].[dbo].[table1]

Server Objects ---> 링크된 서버 ---> 새로운 링크된 서버

링크된 서버에서 다른 서버의 서버 이름 또는 IP 주소를 쓰고 [SQL Server In Security](이 보안 컨텍스트를 사용하여 작성)를 선택합니다.다른 서버의 로그인과 패스워드를 기입합니다.

연결 후 사용

Select * from [server name or ip addresses ].databasename.dbo.tblname

위에서 언급한 모든 설명이 OP의 원래 질문에 대한 답을 얻었기를 바랍니다.SQL Server를 링크 서버로 추가하기 위한 코드 스니펫을 추가하고 싶습니다.

"SQL "를 를 링크된 서버로 할 수 .sp_addlinkedserver는 입니다.@server 말해 네.

-- using IP address
exec sp_addlinkedserver @server='192.168.1.11' 
-- PC domain name 
exec sp_addlinkedserver @server='DESKTOP-P5V8JTN'

으로 SQL Server를 채웁니다.SRV_PROVIDERNAME,SRV_PRODUCT,SRV_DATASOURCE디폴트값으로 설정합니다.이를 통해 쿼리의 4부분 테이블 주소에 IP 또는 PC 도메인 이름을 기입해야 합니다(아래 예).링크된 서버에 기본 포트 또는 인스턴스가 없을 경우 이 주소는 이와 비슷해 보일 수 있으며 읽기 어려울 수 있습니다.192.168.1.11,1430 ★★★★★★★★★★★★★★★★★」192.168.1.11,1430\MSSQLSERVER2019.

따라서 4개의 부품 주소를 짧고 읽기 쉽게 하기 위해 다음과 같이 다른 파라미터를 지정하여 풀주소가 아닌 서버의 에일리어스 이름을 추가할 수 있습니다.

exec sp_addlinkedserver
    @server='ReadSrv1',
    @srvproduct='SQL Server',
    @provider='SQLNCLI',
    @datasrc='192.168.1.11,1430\MSSQLSERVER2019'

이 하면 다음 . - 이 오류가 나다.You cannot specify a provider or any properties for product 'SQL Server'.의 으로 두면''또는 다른 값을 지정하면 쿼리가 정상적으로 실행됩니다.

다음 단계에서는 다음 쿼리를 실행하여 리모트 링크 서버에 로그인합니다.

EXEC sp_addlinkedsrvlogin @rmtsrvname = 'ReadSrv1', @useself = 'false', @locallogin = NULL, @rmtuser = 'sa', @rmtpassword = 'LinkedServerPasswordForSA'

파트주소를 은 - 4개의 파트주소입니다.을 사용하다
[ServerName].[DatabaseName].[Schema].[ObjectName]
- - -

SELECT TOP 100 t.* FROM ReadSrv1.AppDB.dbo.ExceptionLog t
  • 기존 링크된 서버를 나열하려면 다음 작업을 수행합니다.
    exec sp_linkedservers
  • 링크된 서버를 삭제하려면 다음 작업을 수행합니다.
    exec sp_dropserver @server = 'ReadSrv1', @droplogins='droplogins') OR(「」)
    exec sp_dropserver @server = 'ReadSrv1', @droplogins='NULL'(로그인 유지)

언급URL : https://stackoverflow.com/questions/1144051/selecting-data-from-two-different-servers-in-sql-server

반응형