Trigger de Update

11/01/2016

3

Bom dia Galera! Sou iniciante em Banco de Dados e estou com a seguinte situação: Preciso de um trigger que ao ser atualizado determinado campo em uma tabela, seja alterado um determinado campo de outra tabela em outro Banco de dados(sql server)OBS: Os dois bancos de dados estão na mesma instância.Alguém poderia me ajudar na criação desta trigger?
Obrigado
Responder

Post mais votado

11/01/2016

[CREATE TRIGGER ALTERAR_STATUS
ON [FPw_teste].[dbo].[FUNCIONA]
AFTER UPDATE
AS 
DECLATRE @CODSIT INT
SELECT @CODSIT = FUCODSITU FROM INSERTED
DECLARE @MATRICULA INT 
SELECT @MATRICULA = FUMATFUNC FROM INSERTED
IF UPDATE (FUCODSITU) and (@CODSIT in (16,17,18,19,20,21,22,23))
UPDATE [DMPACESSOII_TESTE].[dbo].[PESSOA]
SET CD_SITUACAO_PESSOA = '11'
WHERE NU_MATRICULA = @MATRICULA]


Qual é exatamente a mensagem ?

FUCODSITU é uma coluna da tabela em que a trigger foi criada ?

Você consegue entender o princípio de funcionamento dessa trigger ? Principalmente as cláusulas "INSERTED" e "UPDATE" ?
Responder

Mais Posts

11/01/2016

Marcos P

Adapte a partir de...

CREATE TRIGGER trNomeTrigger ON Tabela
FOR UPDATE
AS      
    UPDATE OutroBD.dbo.OutraTabela SET Coluna = Valor
Responder
Marcos P, Veja este código:

CREATE TRIGGER ALTERAR_STATUS
ON [FPw_teste].[dbo].[FUNCIONA]
AFTER UPDATE
AS

IF UPDATE (FUCODSITU)

UPDATE [DMPACESSOII_TESTE].[dbo].[FUNCIONA]
SET CD_SITUACAO_PESSOA = '11'
WHERE NU_MATRICULA = FUMATFUNC
END
GO
Preciso que toda vez que o campo FUCODSITU tiver seu valor alterado por exemplo para 16, o campo CD_SITUACAO_PESSOA seja alterado para 11... como verificar ou filtrar isso?
Responder

11/01/2016

Marcos P

Sempre que postar código no fórum, use da tag "Inserir Código" ( aí em cima, à esquerda... )

Assumindo que "FUMATFUNC" é obrigatório em todos os registros da tabela, fica...

CREATE TRIGGER ALTERAR_STATUS
ON [FPw_teste].[dbo].[FUNCIONA]
AFTER UPDATE
AS

DECLARE @Matricula INT

SET @Matricula = FUMATFUNC FROM inserted

IF UPDATE (FUCODSITU) and (FCODSITU = 16)
  UPDATE [DMPACESSOII_TESTE].[dbo].[FUNCIONA]
  SET CD_SITUACAO_PESSOA = '11'
  WHERE NU_MATRICULA = @Matricula
GO
Responder

11/01/2016

Claudio Lopes

Filipe, pense se isso é a melhor prática, pois a regra de negócio deve ficar na sua aplicação, e não no banco de dados.
Responder

11/01/2016

Marcos P


Filipe, pense se isso é a melhor prática, pois a regra de negócio deve ficar na sua aplicação, e não no banco de dados.


Perfeito !

Essa prática de encapsular regras de negócio em triggeres, aumenta ( em muito ) a dificuldade de depuração e manutenção do ambiente !
Responder
Marcos obrigado pela ajuda, mas ainda estou com dificuldades....

Ao executar este código, recebo a seguinte mensagem: "Incorrect syntax near the keyord 'FROM' ". O campo FUMATFUNC é a matrícula do colaborador no Banco de dados FPw_teste e está em uma tabela chamada FUNCIONA. No banco de dados DMPACESSOII_TESTE a matrícula deste mesmo colaborador está no campo NU_MATRICULA na tabela PESSOA.Preciso que quando for alterado a situação no Fpw_teste, seja alterado também no DMPACESSOII... Desde já agradeço a atenção....
Responder
Bom dia Din... São duas aplicações diferentes por isso a necessidade de fazer via trigger ...
Responder

11/01/2016

Marcos P

Troque...

SET @Matricula = FUMATFUNC FROM inserted

por...
SELECT @Matricula = FUMATFUNC FROM inserted
Responder
Veja o erro na imagem...
Responder
[CREATE TRIGGER ALTERAR_STATUS
ON [FPw_teste].[dbo].[FUNCIONA]
AFTER UPDATE
AS
DECLARE @MATRICULA INT
SELECT @MATRICULA = FUMATFUNC FROM INSERTED
IF UPDATE (FUCODSITU)
UPDATE [DMPACESSOII_TESTE].[dbo].[PESSOA]
SET CD_SITUACAO_PESSOA = '11'
WHERE NU_MATRICULA = @MATRICULA]
[/code]

com esse código a trigger consegue ser executada, porém preciso que ela só seja executada quando o valor do campo FUCODSITU for alterado para os números de 16 à 23.
Responder

11/01/2016

Marcos P

Basta que você insira a condição no IF, conforme já fiz acima...

IF UPDATE (FUCODSITU) and (FCODSITU in (16,17,18,19,20,21,22,23))


Senão funcionar, faça...

[CREATE TRIGGER ALTERAR_STATUS
ON [FPw_teste].[dbo].[FUNCIONA]
AFTER UPDATE
AS 
DECLATRE @CODSIT INT
SELECT @CODSIT = FUCODSITU FROM INSERTED
DECLARE @MATRICULA INT 
SELECT @MATRICULA = FUMATFUNC FROM INSERTED
IF UPDATE (FUCODSITU) and (@CODSIT in (16,17,18,19,20,21,22,23))
UPDATE [DMPACESSOII_TESTE].[dbo].[PESSOA]
SET CD_SITUACAO_PESSOA = '11'
WHERE NU_MATRICULA = @MATRICULA]
Responder
Se eu não coloco a condição, o código executa, mas se eu coloco a condição conforme acima, recebo erro dizendo que o nome da coluna CODSITU é inválido....
Responder
Marcos, a princípio deu certo aqui...Irei pedir pra validar através da aplicação...
Sim conheço o funcionamento da trigger e as cláusulas INSERTDE e UPDATE... Muito obrigado, a ajuda de vocês resolveu meu problema!!!

Obrigado
Responder