1
resposta

MINHA RESOLUÇÃO + duvida

Minha resolução:
CREATE TRIGGER TG_CLIENTES_IDADE
ON [dbo].[CLIENTES]
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
UPDATE CLIENTES SET IDADE = (DATEDIFF(YEAR, [DATA_NASCIMENTO], GETDATE()))
WHERE IDADE <> (DATEDIFF(YEAR, [DATA_NASCIMENTO], GETDATE()))
END;

Não gostei muito da resolução mostrada, pois se o trigger dispara todas vez que existe um alteração na tabela clientes e o propio trigger gera uma alteração, ele vai continuar infinitamente, no meu eu coloquei o "where IDADE <> ((DATEDIFF(YEAR, [DATA_NASCIMENTO], GETDATE()))".
Dessa forma ele so vai fazer uma alteração se a idade estiver diferente do esperado, e quando todas as idades estiverem no esperado ele não faram mais nenhuma alteração. Ou o propio SQL server saca isso sozinho ?
IIMAGEM DA RESOLUÇÃO PROFESSOR

1 resposta

Ei, Isac! Tudo bem?

Sua linha de raciocínio está certinha! No SQL Server, um AFTER TRIGGER não dispara de novo pelas alterações feitas dentro dele mesmo. Ou seja, mesmo que o trigger atualize a idade da tabela, isso não causa um novo evento de UPDATE dentro do próprio trigger. Então você não teria um loop infinito.

Mas ao adicionar a cláusula WHERE IDADE <> (DATEDIFF(YEAR, [DATA_NASCIMENTO], GETDATE())) é uma boa prática para evitar atualizações desnecessárias e, consequentemente, loops.

Excelente ajuste,continue se dedicando aos estudos e qualquer dúvida, compartilhe no fórum.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado!