Se eu tiver um trigger
before the update
em uma tabela, como posso lançar um erro que impede a atualização nessa tabela?
173
Aqui está um truque que pode funcionar. Não está limpo, mas parece que pode funcionar:
Basicamente, você apenas tenta atualizar uma coluna que não existe.
No MySQL 5.5, você pode usar a
SIGNAL
sintaxe para gerar uma exceção :O estado 45000 é um estado genérico que representa "exceção definida pelo usuário sem tratamento".
Aqui está um exemplo mais completo da abordagem:
fonte
Infelizmente, a resposta fornecida pelo @RuiDC não funciona nas versões MySQL anteriores à 5.5, porque não há implementação de SIGNAL para procedimentos armazenados.
A solução que encontrei é simular um sinal que gera um
table_name doesn't exist
erro, enviando uma mensagem de erro personalizada para otable_name
.O hack pode ser implementado usando gatilhos ou usando um procedimento armazenado. Descrevo as duas opções abaixo, seguindo o exemplo usado pelo @RuiDC.
Usando gatilhos
Usando um procedimento armazenado
Os procedimentos armazenados permitem usar o sql dinâmico, o que possibilita o encapsulamento da funcionalidade de geração de erros em um procedimento. O contraponto é que devemos controlar os métodos de inserção / atualização dos aplicativos, para que eles usem apenas nosso procedimento armazenado (não concedendo privilégios diretos ao INSERT / UPDATE).
fonte
O procedimento a seguir é (no mysql5) uma maneira de gerar erros personalizados e registrá-los ao mesmo tempo:
fonte
fonte
Outro método (hack) (se você não estiver no 5.5+ por algum motivo) que você pode usar:
Se você possui um campo obrigatório, em um gatilho, defina o campo obrigatório como um valor inválido, como NULL. Isso funcionará para INSERT e UPDATE. Observe que, se NULL for um valor válido para o campo obrigatório (por algum motivo maluco), essa abordagem não funcionará.
Se você estiver no 5.5+, poderá usar o estado do sinal conforme descrito em outras respostas:
fonte
fonte