sql >> Databasteknik >  >> RDS >> Oracle

Utlösa alternativ för två tabeller som måste uppdatera varandra

Att använda triggers här är bara att fråga efter problem.

Dessutom är valet att använda schemaläggaren förmodligen inte den bästa idén eftersom de schemalagda jobben bara kan se engagerad data. Så antingen gör du commit i triggern som kastar transaktionslogik ut ur fönstret eller så försenas ändringarna av tabellerna till slutet av transaktionen.

Du bör antingen:

  1. Använd procedurer. Det enklaste svaret. När du har flera applikationer ska de inte utföra DML/businees logik direkt, de ska alltid göra det med procedurer så att de alla kör samma kod. Förbjud direkt DML med bidrag eller synpunkter. Du kan behöva tvinga fram användningen av procedurer genom INSTEAD OF triggers på visningar (tänk bara på detta om du inte kan ändra programmet).

  2. Förmodligen ännu bättre än procedurer i ditt fall:använd ett schema som inte innehåller dubbletter av data. Du vill inte lagra redundant data:detta gör applikationsutvecklingen mer komplex än nödvändigt. När det gäller prestanda, resurser och energi är det bästa sättet att lösa ett problem när du inser att uppgiften är onödig.

    Här är kolumnerna som du kan ta bort från beskrivningen av din modell:

    • task.duration_in_days
    • task.end_date
    • task.needs_recomputation
    • subtask.start_date
    • subtask.end_date


    task Tabellen skulle endast innehålla startdatumet och varje deluppgift skulle bara lagra dess varaktighet. Använd joins när du behöver den samlade informationen. Du kan använda vyer för att låta applikationerna komma åt data på ett transparent sätt.

  3. Använd en lösning för muterande utlösare som använder paketvariabler för att identifiera modifierade rader med BEFORE och AFTER uttalande utlöser. Uppenbarligen kommer detta att involvera massor av kod som kommer att vara svåra att koda, testa och underhålla så du bör använda alternativ (1) och (2) när det är möjligt istället.



  1. Hur kan jag tvinga en underfråga att endast returnera en rad?

  2. Hur tar man bort dubbletter från kommaseparerad lista med regexp_replace i Oracle?

  3. Gå med två tabeller i MySQL, och returnera bara en rad från den andra tabellen

  4. count(*) kan inte väljas i PL/SQL