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

Oracle – Spustí při aktualizaci vytvoření řádku historie

Dobře, tohle je přepis. Co mi při první reakci uniklo, je, že aplikace ukládá svou historii do hlavní tabulky. Teď už chápu, proč se @NickCraver za kód tak omlouvá.

První věc, kterou musíte udělat, je vypátrat pachatele tohoto návrhu a ujistit se, že to už nikdy neudělají. Ukládání historie takto neškáluje, dělá normální (nehistorické) dotazy komplikovanějšími a sabotuje relační integritu. Samozřejmě existují scénáře, kdy na ničem z toho nezáleží, a možná je jedním z nich i váš web, ale obecně jde o velmi špatnou implementaci.

Nejlepší způsob, jak toho dosáhnout, je Oracle 11g Total Recall . Je to elegantní řešení se zcela neviditelnou a efektivní implementací a – podle standardů dalších zpoplatněných doplňků společnosti Oracle – za docela rozumnou cenu.

Ale pokud Total Recall nepřipadá v úvahu a opravdu to musíte udělat, nepovolujte aktualizace . Změna existujícího záznamu CONTACT by měla být vložena. Aby to fungovalo, možná budete muset vytvořit pohled se spouštěčem MÍSTO spouště. Je to pořád hnusné, ale ne tak hnusné jako to, co máte teď.

Od Oracle 11.2.0.4 bylo Total Recall přejmenováno na Flashback Archive a je zahrnuto jako součást Enterprise License (ačkoli se nejedná o komprimované tabulky žurnálu, pokud si nezakoupíme možnost Advanced Compress).

Tato velkolepost od společnosti Oracle by měla učinit z FDA normální způsob ukládání historie:je efektivní, je výkonná, je to vestavěný Oracle se standardní syntaxí pro podporu historických dotazů. Bohužel očekávám, že uvidím napůl uvařené implementace se spatchcocked triggery, zlomenými primárními klíči a příšerným výkonem ještě mnoho let. Protože se žurnálování zdá být jedním z těch rozptýlení, které si vývojáři oblíbili, a to navzdory skutečnosti, že jde o nízkoúrovňové instalatérské práce, které jsou z velké části irelevantní pro 99,99 % všech obchodních operací.



  1. Udržování/aktualizace pořadí záznamů v mysql

  2. mysql počítejte, kolikrát jedno pole odkazuje na druhé

  3. Spuštění kontejneru docker vyžaduje alespoň 1 argument

  4. Vztah MySQL many-to-many s FOREIGN KEYS