Antes ou depois de gatilho para manter registo de auditoria
Pergunta
Estive lendo o comentário corrente MySql 5.0 no criar gatilho página e eu gostaria de pedir à comunidade se as recomendações são bons e se eles ainda se aplicam a 5.1. O que eu tenho notado jogo com gatilhos de hoje é que é impossível atualizar um campo na tabela de idade usando um update depois.
- Tenha cuidado com gatilhos antes. As restrições podem ocorrer, especialmente se você estiver usando o motor InnoDB, onde uma inserção falhará, mas as ações de seu disparador BEFORE terá sucesso.
- Use ANTES gatilhos principalmente para as restrições ou regras, e não operações, aprimorando o NOVO. * Colunas deve ser fino.
- Vara com gatilhos AFTER para a maioria das outras operações, tais como inserção em uma tabela de histórico ou atualizar um desnormalização.
Solução
Sim. AFAIK, MySQL 5.1 não fazer qualquer alteração a semântica de como gatilhos trabalho. MySQL tenta suportar a especificação ANSI / ISO SQL para a semântica de gatilho.
Você pode imaginar que há uma seqüência de operações que é executado como uma linha é gravada no banco de dados:
- Executar ANTES gatilhos
- Avaliar constrangimentos, aplicar
NOT NULL
, aplicar valoresDEFAULT
- Escreva a linha para o banco de dados
- índices de atualização
- Executar gatilhos AFTER
Uma vez que você alcançou o gatilho AFTER, é tarde demais para mudar os valores na linha. Em alguns bancos de dados, você pode definir NEW.somecolumn = 1234
mas essa mudança é descartado silenciosamente como os após a conclusão de gatilho. Em outras bases de dados, que ajuda a compreender o seu erro, dando-lhe um erro ou quando você definir o gatilho ou quando você executar o gatilho.
gatilhos AFTER são mais utilizados para ações extras para tomar como resultado de INSERT / UPDATE da linha, como o log de auditoria que você mencionou. Por um lado, o MySQL só permite que um gatilho por ação por tabela, por isso, se você também estiver usando um disparador BEFORE para alterar valores e impor regras de negócio, agora você pode, pelo menos, manter as ações extras em um gatilho separado. Isso torna mais fácil para atualizar um ou o outro.
A outra consideração é que você provavelmente deve fazer ações extra só após você conhece a linha foi salvo com sucesso. Por exemplo. não seria direito de registrar uma mudança em um disparador BEFORE, e depois ter a mudança abortar por causa de uma restrição NOT NULL.
Para acções Riscar o que você precisa para remover linhas dependentes em outras tabelas, você ainda pode ter que fazer isso em um disparador BEFORE.