Data

20 ago, 2013

Linked Server pra que serve e quando utilizar?

Publicidade

O Linked Server é uma funcionalidade do SQL Server muito útil para estabelecer conexão segura entre dois ou mais servidores. Administradores de banco de dados e desenvolvedores utilizam muito esse recurso para realizarem consultas em outros servidores. Um exemplo da utilização dessa funcionalidade seria, onde o servidor de produção utiliza dados de CEP que está em outro servidor, com isso, é criado um Linked Server para consultar a base de CEP que está fisicamente em outro ambiente.

Também é muito utilizado em softwares que consultam dados na internet, por exemplo, aplicativos que verificam dados climáticos, informações sobre vôos, trânsito… Essas informações nem sempre estão no mesmo servidor e sim em outro que pode ser acessado via Linked Server.

Essa “ponte” de comunicação é possível entre fontes OLE DB, como Excel, Access, servidores SQL Server e até servidores com outro SGBDs como Oracle, Mysql, Sybase.

As principais vantagens de se utilizar Linked Server é a facilidade de executar consultas distribuídas, comandos de atualizações que envolvem diversas bases em servidores diferentes.

Pra simular o Linked Server em ação, será necessário no mínimo duas instâncias, onde elas podem estar ou não no mesmo servidor. Vamos criar um banco de dados e uma tabela, a qual será utilizada para realizar consultas e manipulação através do Linked Server.

A imagem abaixo ilustra a “topologia” dos testes:

artigo

 

A instância SERVER1\SQL2008 conterá o banco de dados DB_LK, que será acessado pela instância SERVER2\SQL2012.

O script abaixo cria o banco de dados na instância SERVER1\SQL2008.

[sql]

Create Database DB_LK
GO

Use DB_LK
GO

 

 

Create Table Table1
(
Id INT IDENTITY NOT NULL,
Nome VARCHAR(50) NULL,
Constraint pkTable1 Primary Key Clustered (Id)
)
GO

Insert Table1 (Nome)
Values (‘João Eduardo’),(‘Jeremias’), (‘Dante’), (‘Lucas’), (Luiz Henrique’)[/sql]

Com banco e tabela criados, vamos criar o Linked Server na segunda instância (SERVER2\SQL2012), onde o propósito é consultar os dados do banco DB_LK que está na primeira instância (SERVER1\SQL2008).

Abaixo, segue código de criação:

[sql]

EXEC master.dbo.sp_addlinkedserver
@server = N’LK2008′,
@srvproduct=N”,
@provider=N’SQLNCLI’,
@datasrc=N’SERVER1\SQL2008′

EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname=N’LK2008′,
@useself=N’True’,
@locallogin=’sa’,
@rmtuser=NULL,
@rmtpassword=’sa'[/sql]

Importante: Observe que o usuário informado é o “SA”. Utilizei-o de propósito para demonstrar esse erro que comentemos. Por boas práticas não é aconselhável utilizar o SA no Linked Server por motivos de segurança. O correto é criar um usuário com as permissões necessária,s que será utilizado somente pelo Linked Server. Além de garantir a segurança, também podemos auditar as ações executadas por esse usuário.

O script acima cria um Linked Server onde o parâmetro @datasrc recebe como valor a instância SERVER1\SQL2008. Com essa configuração, criamos um canal de comunicação entre os servidores SERVER1\SQL2008 e SERVER2\SQL2012.

Após criar o ambiente, vamos executar alguns scripts com propósito de simular a utilização do Linked Server.

A sintaxe correta do Linked Server é:

[sql]Select * From [LinkedServer].[RemoteDatabase].[Owner].[Table]
Exemplo:
Select * From LK2008.DB_LK.dbo.Table1[/sql]

A Figura abaixo representa um SELECT utilizando Linked Server para retorna dados do banco de dados DB_LK que está na outra instância:

artigo2

 

O Select está sendo executado na instância SERVER2\SQL2012 e busca as informações na instância SERVER1\SQL2008.

Outro exemplo é representado abaixo, onde a query está sendo executada na instância SERVER2\SQL2012, porém realizando UPDATE na tabela Table1 do DB_LK que está alocado no servidor SERVER1\SQL2008.

artigo3

Com esse artigo, pretendo demonstrar o conceito de Linked Server e o quanto isso pode útil no desenvolvimento do dia a dia. Espero ter replicado a informação de forma simples e objetiva.

Caso tenha ficado alguma dúvida ou deseje mais material sobre o assunto, me enviem e-mail (luizh.rosario@gmail.com) ou deixo abaixo nos comentários que retorno o mais rápido possível.

Grande abraço!