Ir para o conteúdo
ferreira12

Trigger

Mensagens Recomendadas

ferreira12

Boas,

Gostaria de saber se o método que estou usar é o melhor pra este tipo de tratamentos.

Eu tenho uma importar diariamente informação pra BD, e posteriormente exporto isso para outro local.

Muitas das vezes as alterações(updates) que existem são minimas. então eu queria que quando exportasse a informação exporta-se apenas os registos que sofreram updates.

Pelas minhas pesquisas vi que os trigger ajudam, mas será que existe outro método melhor?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rechousa

Ok.

Invocas a Stored Procedure apenas uma vez com todos os dados que pretendes importar ou executas a tua Stored Procedure múltiplas vezes?

O que faz a tua SP ? Apenas faz INSERT's? Verifica se os dados existem, se existirem faz UPDATEs, se não existirem faz os INSERT's ? Elimina todos os dados anteriores e depois insere os dados novos?


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ferreira12

O meu SP verifica se dos dados existem, se existirem e algum do campo sofreu alteração faz UPdate, se nao se existir faz INSERT'S

só execute uma vez o meu sp.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rechousa

Eu tenho uma importar diariamente informação pra BD...

É nessa importação que usas a SP que descreveste acima, certo?

...e posteriormente exporto isso para outro local.

É outra BD? Está no mesmo servidor? Qual a edição do SQL server que usas?

Muitas das vezes as alterações(updates) que existem são minimas. então eu queria que quando exportasse a informação exporta-se apenas os registos que sofreram updates.

Nesta exportação que referes, é para o tal outro local, certo?


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ferreira12

ponto 1

Sim é nessa importação que uso o SP acima descrito.

ponto 2

Sim está no mesmo servidor, pois a ideia é passar devolver novamente o ficheiro em txt.

Basicamente quero filtrar os updates para poder mandar uma nova exportação txt, ou seja estou a fazer um encaminhador.

Uso sqlserver 2005 express.

ponto 3

Sim.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rechousa

Usando SQL Server Integration Services, conseguirias fazer isso também, mas não terias tanto controlo, além de que os Integration Services não estão disponíveis para a edição que usas (http://msdn.microsoft.com/en-us/library/ms143761%28v=sql.90%29.aspx).

Usando triggers consegues apanhar os comandos de UPDATE e verificar se existem diferenças, mas aparentemente já verificas se há diferenças na tua Stored Procedure.

Como queres "devolver" apenas os registos que foram alterados, precisas de os marcar de alguma forma para os poderes retornar mais tarde.

Poderias fazer isso criando um novo campo na tabela que indica se foi alterado ou não, ou através de uma nova tabela em que, para cada registo alterado, seria feito um insert com o nome da tabela que sofreu alteração (se tiveres mais do que uma tabela) e com o ID do registo que foi alterado. Se executares tudo dentro da tua stored procedure, podes usar uma variável do tipo tabela (http://www.sqlteam.com/article/using-table-variables)

No final do procedimento, retornarias os registos alterados da(s) tabelas.

Espero ter ajudado.


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ferreira12

Olá,

@Cod CHAR (3), @Descricao CHAR (30)
AS
IF NOT EXISTS
(SELECT Cod FROM Moeda
WHERE Cod = @Cod)
INSERT INTO Moeda (Cod, Descricao, Alterado) VALUES (@Cod, @Descricao, 'S')
ELSE
UPDATE Moeda set Descricao=@Descricao WHERE Cod=@CodMoeda

Será que me podes ajudar a concluir quando ocorre um update passar para 'N'?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ferreira12

Olá novamente,

Estava a tentar a solução abaixo mas não estou a entender o porque de quando faço o if ele não me reconhecer descricao?

@Cod CHAR (3), @Descricao CHAR (30)
AS
IF NOT EXISTS
(SELECT Cod FROM Moeda
WHERE Cod = @Cod )
INSERT INTO Moeda (Cod, Descricao, Alterado) VALUES (@Cod, @Descricao, 'S')
ELSE
begin
if @Descricao<>Descricao
UPDATE Moeda set Descricao=@Descricao, alterado='S' WHERE Cod=@Cod
end

Editado por apocsantos
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rechousa

Olá,

Ele não te reconhece Descricao, porque é inválido. Descricao por si só não existe. Existe sim, Descricao associado à tabela Moeda.

Se a ideia é verificares se foi alterado então o código poderia ser este:

IF NOT EXISTS
(SELECT Cod FROM Moeda
WHERE Cod = @Cod )
INSERT INTO Moeda (Cod, Descricao, Alterado) VALUES (@Cod, @Descricao, 'S')
ELSE
BEGIN
   -- O ISNULL está a garantir que encontra a diferença,  no caso dos valores serem nulos.
   -- Se o teu campo na BD não permitir nulos e se o valor em @Descricao também nunca for nulo, podes usar UPDATE Moeda SET Descricao=@Descricao, alterado='S' WHERE Cod=@Cod AND Descricao <> @Descricao
   UPDATE Moeda SET Descricao=@Descricao, alterado='S' WHERE Cod=@Cod AND NOT (ISNULL(Descricao, '') = ISNULL(@Descricao, ''))
END

Espero ter ajudado.


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ferreira12

Sim boa dica,

E para os casos que existam mais campos na tabela?

exemplo:

@Cod CHAR (3), @Descricao CHAR (30), @DescricaoAbre CHAR (30)
AS
IF NOT EXISTS
(SELECT CodMoeda FROM Moeda
WHERE Cod = @Cod )
INSERT INTO Moeda (Cod, Descricao, DescricaoAbre, Alterado) VALUES (@Cod, @Descricao,@DescricaoAbre, 'S')
ELSE
BEGIN
-- O ISNULL está a garantir que encontra a diferença, no caso dos valores serem nulos.
-- Se o teu campo na BD não permitir nulos e se o valor em @Descricao também nunca for nulo, podes usar UPDATE Moeda SET Descricao=@Descricao, alterado='S' WHERE --Cod=@Cod AND Descricao <> @Descricao
UPDATE Moeda SET Descricao=@Descricao, DescricaoAbre=@DescricaoAbre,alterado='S'
WHERE Cod=@Cod AND NOT (ISNULL(Descricao, '') = ISNULL(@Descricao, '')) AND NOT (ISNULL(DescricaoAbre, '') = ISNULL(@DescricaoAbre, ''))
END

Pondo com o código acima passa tudo pra S? não estou a conseguir mostrar

Editado por Caça
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ferreira12

Olá uma vez mais, coloquei da seguinte forma, acham que é a melhor opção?

@Cod CHAR (3), @DescricaoAbrev CHAR (3), @Descricao CHAR (15)
AS
IF NOT EXISTS
(SELECT Cod FROM Moeda
WHERE Cod = @Cod)
INSERT INTO Moeda (Cod, DescricaoAbrev, Descricao, Alterado) VALUES (@Cod, @DescricaoAbrev, @Descricao, 'S')
ELSE
BEGIN
UPDATE Moeda set DescricaoAbrev=@DescricaoAbrev, Descricao=@Descricao, alterado='S'
WHERE Cod=@Cod and DescricaoAbrev<>@DescricaoAbrev
BEGIN
UPDATE Moeda set DescricaoAbrev=@DescricaoAbrev, Descricao=@Descricao, alterado='S'
WHERE Cod=@Cod and Descricao<>@Descricao
END
END

Editado por Caça
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.