sql >> Databáze >  >> RDS >> Oracle

Spustit alternativy pro dvě tabulky, které se musí vzájemně aktualizovat

Použití spouštěčů si zde jen koleduje o potíže.

Kromě toho volba použití plánovače pravděpodobně není nejlepší nápad, protože naplánované úlohy mohou vidět pouze potvrzená data. Takže buď se zavazujete ve spouštěči, který vyhodí transakční logiku z okna, nebo se změny v tabulkách pozdrží až do konce transakce.

Měli byste buď:

  1. Používejte postupy. Nejjednodušší odpověď. Když máte více aplikací, neměly by provádět logiku DML/businees přímo, měly by to vždy dělat pomocí procedur, aby všechny spouštěly stejný kód. Zakázat přímé DML pomocí grantů nebo zobrazení. Možná budete muset vynutit použití procedur pomocí INSTEAD OF spouští při zobrazeních (toto zvažte pouze v případě, že nemůžete aplikaci upravit).

  2. Pravděpodobně ještě lepší než postupy ve vašem případě:použijte schéma, které neobsahuje duplicitní data. Nechcete ukládat redundantní data:díky tomu je vývoj aplikací složitější, než je potřeba. Pokud jde o výkon, zdroje a energii, nejlepší způsob, jak vyřešit problém, je, když si uvědomíte, že úkol je zbytečný.

    Z popisu vašeho modelu jsou sloupce, které můžete odstranit:

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


    task tabulka by obsahovala pouze datum zahájení a každý dílčí úkol by ukládal pouze jeho trvání. Když potřebujete souhrnné informace, použijte spojení. Pomocí zobrazení můžete aplikacím umožnit transparentní přístup k datům.

  3. Použijte řešení spouštěče mutace který používá proměnné balíčku k identifikaci upravených řádků pomocí BEFORE a AFTER spouštěče příkazů. Je zřejmé, že to bude zahrnovat spoustu kódu, který bude obtížné kódovat, testovat a udržovat, takže byste místo toho měli používat možnosti (1) a (2), kdykoli je to možné.



  1. Jak vložím více hodnot do postgresové tabulky najednou?

  2. Klasifikace dat v IRI Workbench

  3. Chyba souboru připojení PHP v Postman

  4. SET a SELECT v rámci jednoho dotazu?