Na dica desta semana veremos como contarnar estas limitações da utilização de um linked server.
Para contornar este problema, você pode utilizar três soluções diferentes:
· Views
· Procedures
· A função OPENQUERY
No caso das views, ao invés de acessar diretamente a tabela no servidor remoto através do Linked Server, pode-se criar uma view da tabela no servidor remoto que contenha o hint NOLOCK e acessá-la através do Linked Server.
Exemplo:
No servidor Remoto crie a view
CREATE VIEW dbo.VTeste
AS
SELECT au_id, au_lname, au_fname
FROM dbo.authors WITH (nolock)
No servidor Local chame a view do servidor remoto
SELECT au_id, au_lname, au_fname FROM [MeuLinkedServer].pubs.dbo.Vteste
A segunda opção é criar uma stored procedure no servidor remoto fazendo uso do NOLOCK e do ROWLOCK quando necessário e executá-la a partir do servidor local. Além da procedure manter o plano de acesso à tabela pré-compilado, podemos colocar o NOLOCK no SELECT, melhorando o desempenho em tabelas onde a concorrência é grande.
Exemplo:
No Servidor Remoto crie a procedure
CREATE PROC SP_Teste
AS
SELECT A.au_id, B.au_ord
FROM [LinkedServer].pubs.dbo.authors A
INNER JOIN [LinkedServer].pubs.dbo.titleauthor B (nolock)
ON A.au_id = B.au_id
No servidor Local chame a procedure do servidor remoto
EXEC [MeuLinkedServer].Pubs.dbo.SP_Teste
A terceira opção é a utilização do OPENQUERY. Esta função pode ser especificada na cláusula FROM da consulta a ser executada com a mesma funcionalidade do nome de uma tabela, recebendo como argumentos o nome do Linked Server a ser acessado e uma string com o comando a ser executado.
Vantagens:
– Função executa uma consulta em que o comando é enviado diretamente ao servidor de destino para ser processado (consultas pass-through);
– Permite o uso de query hints (NOLOCK, ROWLOCK, etc);
– A função OPENQUERY pode ser utilizada em comandos INSERT, UPDATE e DELETE;
Desvantagens:
– Não aceita variáveis como argumento;
– Possui o limite de 8000 caracteres para cada argumento.
Exemplo:
SELECT au_id, au_lname, au_fname
FROM OPENQUERY([MeuLinkedServer],SELECT * FROM PUBS.DBO.AUTHORS (NOLOCK))
Considerações Importantes:
Procedimentos que devem ser seguidos na utilização do Linked Server:
1) Utilizar o mesmo usuário e senha nos servidores envolvidos.
2) As permissões (GRANT) devem ser liberadas para ambos os servidores.
3) Ao utilizar o SQL Server 2000 Enterprise Manager ou o isql.exe/osql.exe para criar ou alterar uma stored procedure contendo queries com linked server, você pode receber o seguinte erro:
Error 7405: Heterogeneous queries require the ANSI_NULLS and ANSI_WARNINGS options to be set for the connection. This ensures consistent query semantics. Enable these options and then reissue your query.
Causa
Por padrão o SQL Server 2000 Enterprise Manager ou o isql.exe/osql.exe definem na sua conexão os parâmetros ANSI_NULLS e ANSI_WARNINGS como OFF gerando o erro especificamente em situações com stored procedures que contenham Linked Server. Porém, podemos perceber que no Query Analyzer este erro não ocorre pois no os parâmetros ANSI_NULLS e ANSI_WARNINGS por padrão são configurados como ON.
Solução
Para solucionar este problema deve-se definir antes da criação/alteração da Stored Procedure os parâmetros ANSI_NULLS e ANSI_WARNINGS como ON como mostrado abaixo:
Set ANSI_NULLS ON
Set ANSI_WARNINGS ON
Go
Create Proc sp_teste
As
SELECT au_id, au_lname, au_fname
FROM [LinkedServer].pubs.dbo.authors
4) Remover todos os parâmetros (NOLOCK) da cláusula FROM que se referem ao Linked Server.
5) Utilizar SET XACT_ABORT ON para possibilitar a execução de rollback automático em casos de erros em tempo de execução.
Para saber mais sobre Linked Server e OPENQUERY, consulte o BOL do SQL Server 2000.

