Ir para conteúdo

Arquivado

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

Joao Lucas

Insert / Update / Delete em BD de outra instancia.

Recommended Posts

Caroa, Boa Tarde. Tenho a seguinte situação, servidor SRV-APP03, banco de dados origem (MP-OFC) com uma tabela SB2010 (saldos em estoque), e outro banco, sevidor SRV-HML, banco de dados destino (MP-IFC), tabela C_INVENTORY_QUANT_INT.

 

Fiz 3 trigger (insert, update e delete), que ao atualizar o estoque na tabela "SB2", replica a informação para a tabela "C_INVENTORY_QUANT_INT". Fiz os testes com utilizando o mesmo servidor, tudo ok, porem em servidores diferentes não consegui. Alguem pode me ajudar: abaixo a trigger de update.

 

OBS: Aqui está usando o banco MP11-SUP que está no mesmo servidor do MP-IFS, quando eu copio essa trigger para o outro servidor "SRV-APP03", atualizando no servidor "SRV-HML", gera um erro, pois não encontra o servidor destino.

 

USE [MP11-SUP]
GO
/****** Object: Trigger [dbo].[trgAlteraEstoqueIFS] Script Date: 09/18/2014 11:10:28 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: João Lucas Esteves e Estevam
-- Create date: 04/06/2014
-- Description: Altera um registro na tabela C_INVENTORY_QUANT_INT Banco MP-IFS quando um registro for
-- alterado na tabela SB2010
-- =============================================
ALTER TRIGGER [dbo].[trgAlteraEstoqueIFS]
ON [MP11-SUP].[dbo].[sB2010]
AFTER UPDATE
AS
BEGIN

SET NOCOUNT ON

DECLARE
@RECNO INT

SELECT @RECNO = R_E_C_N_O_ FROM inserted

-- Verifica se o saldo em estoque para o Produto e Almoxarifado já existe na tabela do IFS

IF (SELECT COUNT(*)
FROM [sRV-HML].[MP-IFS].[dbo].[C_INVENTORY_QUANT_INT]
WHERE INT_RECNO = @RECNO) = 0

-- Se não existir, cria o registro na tabela C_INVENTORY_QUANT_INT

BEGIN

INSERT INTO [sRV-HML].[MP-IFS].[dbo].[C_INVENTORY_QUANT_INT]
([iNT_PART_NO]
,[iNT_DESCRIPTION]
,[iNT_QTD_ONHAND]
,[iNT_LOCAL_NO]
,[iNT_SERIAL_NO]
,[iNT_LOT_BATCH_NO]
,[iNT_INVENTORY_VALUE]
,[iNT_TYPE]
,[iNT_RECNO])

SELECT dbo.SB1010.B1_COD,
dbo.SB1010.B1_DESC,
dbo.SB2010.B2_QATU,
dbo.SB2010.B2_LOCAL,
'',
'',
dbo.SB2010.B2_CM1,
'1',
dbo.SB2010.R_E_C_N_O_

FROM dbo.SB2010
INNER JOIN dbo.SB1010 ON dbo.SB1010.B1_COD=dbo.SB2010.B2_COD
WHERE dbo.SB2010.D_E_L_E_T_ <> '*' AND dbo.SB1010.D_E_L_E_T_ <> '*'
AND dbo.SB2010.R_E_C_N_O_ = @RECNO


END

ELSE

-- Se exitir Efetua a atualização do Estoque e Custo médio no Item

BEGIN

UPDATE [sRV-HML].[MP-IFS].[dbo].[C_INVENTORY_QUANT_INT]
SET INT_QTD_ONHAND = B2_QATU,
INT_INVENTORY_VALUE = B2_CM1,
INT_TYPE = '2'
FROM [sRV-HML].[MP-IFS].[dbo].[C_INVENTORY_QUANT_INT]
INNER JOIN dbo.SB2010 ON dbo.SB2010.R_E_C_N_O_ = INT_RECNO
INNER JOIN dbo.SB1010 ON dbo.SB1010.B1_COD=dbo.SB2010.B2_COD
WHERE dbo.SB2010.D_E_L_E_T_ <> '*' AND dbo.SB1010.D_E_L_E_T_ <> '*'
AND dbo.SB2010.R_E_C_N_O_ = @RECNO

END

END

 

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde, João Lucas.

 

Você criou um linked Server apontando para o servidor de destino? Caso não tenha criado, no object Explorer(dentro do management Studio) abra a pasta “Server Objects” e selecione a opção “New linked Server” que aparecerá ao clicar com o botão direito sobre a pasta “linked servers” e crie um Linked Server apontando para o servidor de destino. Caso já tenha criado, mas ao clicar sobre ele com o botão direito e selecionar a opção Test connection é apresentada uma mensagem de erro, verifique as propriedades de segurança e se o tipo de autenticação está correto, se utilizará do mesmo contexto de segurança para autenticar no servidor de destino ou algum usuário especifico.

 

Sinceramente, não recomendo essa prática, pois:
Performance – Caso a tabela no servidor de destino contenha bloqueios ou a rede esteja lenta, sua aplicação também ficará lenta.

Disponibilidade do servidor de destino – Caso a tabela esteja indisponível ou alguém apagou ou teve o nome alterado temporariamente, ou até mesmo o servidor está desligado para manutenção. Sua aplicação no servidor de origem apresentará mensagens de erro.

Entre outros fatores.

 

Recomendações.

 

Replicação transacional, crie uma publicação da tabela no servidor de origem, e uma subscrição ou “assinatura” no servidor de destino, assim caso ocorra algum problema na rede, apenas a replicação dará erro e sua aplicação continuará funcionando normalmente.

 

Caso o SRV-HML seja servidor de homologação (como o próprio nome sugere) verifique a real necessidade da atualização desses dados em real time, e caso a tabela possa ser replicada de tempos em tempos(a cada 1,2,6,12 ou 24 horas), crie um job para atualizar a tabela do servidor de homologação, assim sua aplicação também funcionará corretamente caso ocorra algum problema com o servidor de destino.

 

Caso você utilize o SQL Express.(não possui suporte a Jobs nem a replicação), pode criar uma bat utilizando o utilitário Bcp (para backup da tabela no servidor de origem e restore no servidor de destino) ou o utilitário SQLCMD para executar o script de atualização a partir de um arquivo e agende-a usando o agendador de tarefas.

 

 

Qualquer duvida ou auxilio para criação das rotinas citadas acima, só entrar em contato.

Espero ter ajudado.

Um abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah e algo que me lembrei... se mesmo assim, for usar as triggers, pelo menos faça um tratamento de erros usando try/catch.

begin try

 

--script da trigger

 

end try

 

begin catch

 

-- ação a ser tomada em caso de erro, como salvar o erro e o registro que não pode ser atualizado em uma tabela de log para uma futura atualização.

 

end catch

Abraço!

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.