Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Paulodemoc

Triggers com Linked Servers e Teste de Linked Server

Recommended Posts

Bom dia pessoal.

 

Eu desenvolvi uma trigger que faz alterações em uma tabela no linked server sempre que a tabela no banco local é alterada.

Para evitar processamento desnecessário, eu coloquei um teste para verificar se o Linked Server está online ou não.

Eu tentei fazer o teste utilizando o 'sys.sp_testlinkedserver' e utilizando o 'master..xp_cmdshell' com o comando de ping.

Eu executei alguns testes, e eles verificam corretamente se o Linked Server está up ou down. Só que aí começou o problema

da trigger.

Quando eu insiro ou altero um valor da tabela, antes mesmo de entrar na trigger (coloquei mensagens para acompanhar o processo)

ele verifica um teste e informa a seguinte mensagem de erro:

 

OLE DB provider "SQLNCLI" for linked server "SERVIDOR" returned message "Login timeout expired".

OLE DB provider "SQLNCLI" for linked server "SERVIDOR" returned message "An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections.".

Msg 65535, Level 16, State 1, Line 0

SQL Network Interfaces: Error Locating Server/Instance Specified [xFFFFFFFF].

Sendo que SERVIDOR é o nome do Linked Server....

Na trigger, ele não faz nenhuma referência ao Linked Server caso ele esteja down.

O teste é feito direito com o IP da máquina servidor.

 

Na trigger, o teste é feito da seguinte forma:

 

DECLARE @ret INT
exec sp_CheckServer @ret OUTPUT
IF (@ret = 1)....

e a Stored Procedure sp_CheckServer é a seguinte:

 

AS
BEGIN
SET NOCOUNT ON;
DECLARE @srvr NVARCHAR(128), @command NVARCHAR(128);
SET @srvr = '192.168.0.31'
SET @command = 'ping -n 1 -i 5 ' + @srvr
CREATE TABLE #ping ( ResultLine varchar(128));
INSERT #ping
EXEC master..xp_cmdshell @command;
SET @retval = ( SELECT 1 FROM #ping WHERE ResultLine LIKE '%TTL=%' )
DROP TABLE #ping
END

Como disse, eu executei os testes e o comando identifica corretamente se o servidor está online ou não.

Aviso a todos que forem me sugerir o 'sys.sp_testlinkedserver': Eu já utilizei essa procedure, o problema é o mesmo... ou seja, não faz diferença qual eu uso.

 

Se alguém souber qual é o problema e puder me auxiliar, eu ficaria muito grato.

 

Att.

 

Paulo Henrique Vieira Neves

Compartilhar este post


Link para o post
Compartilhar em outros sites

Paulodemoc,

 

primeiramente,

Por que ninguém nunca responde meus tópicos? ¬.¬

O fórum eh um meio de trocarmos experiencias e nem sempre todos sabem o que você procura ou nao entenderam a sua duvida. Tanto moderadores qto usuario soh ganham conhecimento em ajudar. Se nao foi respondido deve ter sido pelo fato das pessoas nao terem enfrentado o msm problema que você ;)

 

Agora com relacao a sua duvida:

OLE DB provider "SQLNCLI" for linked server "SERVIDOR" returned message "Login timeout expired".

Tem uma atualizacao para este cara no site da microsoft (estou sem acesso ao site, mas pode ser obitda pelo windows update)

 

Eu peguei este erro: SQL Network Interfaces: Error Locating Server/Instance Specified [xFFFFFFFF].

e no meu caso era o server de destino que estava instavel(regra de firewall bloqueando pacotes)

 

Um teste simples: Crie outra instancia em seu pc e rode todo o seu processo entre as instancias para ver se o erro persiste.

No log do SQL ele gera algum outro erro?

 

Abçs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, obrigado pela resposta :)

 

Eu só falei aquilo porque não foi a primeira vez, mas foi mais pra chamar a atenção xD

 

Eu já instalei as atualizações para o SQLNCLI, só não instalei uma maior, de 140Mb....

Esse problema é meio instável, pq uma hora funciona, dps, sem modificar nada, sem motivo aparente... começa esse erro... dps funciona mais uma vez apenas... eu fico sem entender...

 

Esse erro:

SQL Network Interfaces: Error Locating Server/Instance Specified [xFFFFFFFF].

acontece quando eu tiro o cabo de rede ou desabilito a placa de rede pra testar o tratamento offline... só que quando faço isso, nem entra na trigger... já aparece esse erro...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Jus2ka,

 

esse meu problema é muito confuso e não consegui achar nada à respeito u_U

algumas vezes, ele resolve simplesmente funcionar, eu desligo o cabo de rede e as triggers são executadas perfeitamente, executando o tratamento offline....

Mas são poucas as vezes que funcionam... na maioria (99% das execuções), ela simplesmente exibe aquela mensagem...

E o que me mata mais, é que eu não mudo nada... eu simplesmente tento executar em momentos aleatórios...

Já tentei até limpar a cache de planos de execução compilados, mas não adiantou.

Parece que a menor referência à um linked server na trigger, mesmo que a sequência de execução leve ao else (onde o linked não é acessado), faz com que o SQL SERVER tente logar no Linked Server, gerando o erro...

Teria uma maneira de prevenir isso de ocorrer?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Paulodemoc,

 

cara, tentei ateh simular este erro, mas sem sucesso. Pq ao inves de usar uma trigger, nao faz uma replicacao? Uma ideia.

 

Qdo se trata de Linked Server, realmente, qdo você tenta usar qq objeto que tenha uma menção ao linked ele tenta conectar a ele primeiro.

 

Tem como dar uma descricao do seu ambiente?! Monto um aki e vejamos no que dah.

 

Abçs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na minha máquina eu rodo windows xp professional service pack 2, com o sql server 2005 express com os patchs do sqlncli instalados. O servidor de BD roda windows server 2003 com sql server 2005 professional. O engraçado foi que resolvi testar em outra máquina (!), na mesma empresa, com as mesmas configurações, e nessa máquina funcionou tudo perfeitamente.... dois dias depois deu o mesmo erro algumas vezes, mas depois parou e voltou a funcionar perfeitamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.