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.

  1. 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.
  2. Use ANTES gatilhos principalmente para as restrições ou regras, e não operações, aprimorando o NOVO. * Colunas deve ser fino.
  3. 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.
Foi útil?

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:

  1. Executar ANTES gatilhos
  2. Avaliar constrangimentos, aplicar NOT NULL, aplicar valores DEFAULT
  3. Escreva a linha para o banco de dados
  4. índices de atualização
  5. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top