Usar gatilhos aqui é apenas pedir problemas.
Além disso, a escolha de usar o agendador provavelmente não é a melhor ideia, pois os trabalhos agendados podem ver apenas dados confirmados. Portanto, ou você está confirmando no gatilho que lança a lógica da transação para fora da janela ou as alterações nas tabelas são atrasadas até o final da transação.
Você deve:
-
Procedimentos de uso. A resposta mais simples. Quando você tem vários aplicativos, eles não devem executar a lógica DML/businees diretamente, eles devem sempre fazê-lo com procedimentos para que todos executem o mesmo código. Proibir DML direto com concessões ou visualizações. Você pode precisar forçar o uso de procedimentos através deINSTEAD OF
gatilhos nas visualizações (considere isso apenas se você não puder modificar o aplicativo).
-
Provavelmente ainda melhor do que procedimentos no seu caso:use um esquema que não contenha dados duplicados. Você não deseja armazenar dados redundantes:isso torna o desenvolvimento de aplicativos mais complexo do que o necessário. Em termos de desempenho, recursos e energia, a melhor maneira de resolver um problema é quando você percebe que a tarefa é desnecessária.
Na descrição do seu modelo, aqui estão as colunas que você pode remover:
- tarefa.duration_in_days
- task.end_date
- task.needs_recomputation
- subtarefa.start_date
- subtask.end_date
Atask
A tabela conteria apenas a data de início e cada subtarefa armazenaria apenas sua duração. Quando você precisar das informações agregadas, use junções. Você pode usar visualizações para permitir que os aplicativos acessem os dados de forma transparente.
-
Use uma solução alternativa do gatilho de mutação que usa variáveis de pacote para identificar linhas modificadas comBEFORE
eAFTER
gatilhos de declaração. Obviamente, isso envolverá muito código que será difícil de codificar, testar e manter, então você deve usar as opções (1) e (2) sempre que possível.