quarta-feira, 6 de abril de 2016

Update inóquo também aciona trigger

Ao executar um update em que a condição não seja atendida, 0 linhas serão afetadas (inóquo, i.e., sem efeito), e os triggers associados serão executados, mesmo que nenhum dado seja modificado. O único problema aqui é executar alguma ação que conte com o acionamento do trigger sem testar se realmente algum dado foi modificado.

Acabei de eliminar um bug que estava enviando email sobre a exclusão de consumidor porque em qualquer condição que não era uma inclusão ele entrava no ELSE e montava o corpo do email. O bug é que em caso de alteração ou de falha de update o email era enviado, e nestes casos, vazios.

Exemplo:
if exists(select * from inserted)
{código do insert/update}
else
{código do update/delete e dos casos acima, que pode ser um bug ou algo especial}

Uma possível solução:
if exists(select * from inserted)
{código do insert/update}
else if exists(select * from deleted)
{código do update/delete e dos casos acima, que pode ser um bug ou algo especial}

Um código independente pode estar fora do IF..ELSE.

That's all for now, folks!