Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Acionar alternativas para duas tabelas que precisam se atualizar mutuamente


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:

  1. 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 de INSTEAD OF gatilhos nas visualizações (considere isso apenas se você não puder modificar o aplicativo).

  2. 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


    A task 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.

  3. Use uma solução alternativa do gatilho de mutação que usa variáveis ​​de pacote para identificar linhas modificadas com BEFORE e AFTER 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.