Jump to content
ferreira12

Trigger

Recommended Posts

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?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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'?

Share this post


Link to post
Share on other 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

Edited by apocsantos
geshi

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Edited by Caça
GeSHi

Share this post


Link to post
Share on other 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

Edited by Caça
GeSHi

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.