Het gebruik van triggers hier is gewoon vragen om problemen.
Bovendien is de keuze om de planner te gebruiken waarschijnlijk niet het beste idee, aangezien de geplande taken alleen vastgelegde gegevens kunnen zien. Dus ofwel commit je je aan de trigger die de transactielogica uit het raam gooit, ofwel worden de wijzigingen aan de tabellen uitgesteld tot het einde van de transactie.
U moet ofwel:
-
Gebruik procedures. Het eenvoudigste antwoord. Als je meerdere applicaties hebt, moeten ze de DML/bedrijfslogica niet rechtstreeks uitvoeren, ze moeten dit altijd doen met procedures zodat ze allemaal dezelfde code uitvoeren. Verbied directe DML met subsidies of views. Mogelijk moet u het gebruik van procedures forceren via
INSTEAD OF
triggers op weergaven (overweeg dit alleen als u de toepassing niet kunt wijzigen). -
Waarschijnlijk zelfs beter dan procedures in jouw geval:gebruik een schema dat geen dubbele gegevens bevat. U wilt geen overbodige data opslaan:dit maakt applicatieontwikkeling complexer dan nodig. In termen van prestatie, middelen en energie, is de beste manier om een probleem op te lossen, wanneer je je realiseert dat de taak niet nodig is.
Uit de beschrijving van uw model zijn hier de kolommen die u zou kunnen verwijderen:
- task.duration_in_days
- task.end_date
- task.needs_recomputation
- subtask.start_date
- subtask.end_date
Detask
tabel zou alleen de startdatum bevatten en elke subtaak zou alleen de duur ervan opslaan. Gebruik joins als u de verzamelde informatie nodig hebt. U kunt weergaven gebruiken om de applicaties transparant toegang te geven tot de gegevens. -
Gebruik een oplossing voor het muteren van triggers die pakketvariabelen gebruikt om gewijzigde rijen te identificeren met
BEFORE
enAFTER
verklaring triggert. Het is duidelijk dat dit veel code met zich meebrengt die moeilijk te coderen, testen en onderhouden is, dus u moet in plaats daarvan waar mogelijk de opties (1) en (2) gebruiken.