Chápu, že chyby v mutační tabulce jsou způsobeny konstrukční vadou nebo problematickým dotazem.
Nedávno byl uveden do výroby starý dotaz, který vyvolá chybu mutující tabulky. Naše DBA problém vyřešila, ale nevíme jak.
Co přesně způsobuje chyby mutace tabulky a jak by náš problém vyřešil náš DBA?
Nejpravděpodobnější příčinou chyby mutující tabulky je zneužití spouštěčů. Zde je typický příklad:
Toto je očekávané a normální chování, které vás společnost Oracle chce chránit před sebou, protože společnost Oracle zaručuje:
Nejpravděpodobnější je, když při psaní tohoto typu spouštěče očekáváte, že dotaz (2) uvidí řádek vložený do (1). To by bylo v rozporu s oběma body výše, protože aktualizace ještě není dokončena (může být vloženo více řádků).
Oracle mohl vrátit výsledek konzistentní s časovým okamžikem těsně před začátek prohlášení, ale z většiny příkladů, které jsem viděl, jak se snaží tuto logiku implementovat, lidé vidí víceřádkový příkaz jako řadu po sobě jdoucích kroků a očekávají, že prohlášení [2] uvidí změny provedené v předchozích krocích. Oracle nemůže vrátit očekávaný výsledek, a proto vyvolá chybu.
Pro další čtení: "mutující tabulka" na Ask Tom .
Pokud se domnívám, že příčinou chyby mutační tabulky je spoušť, jedním ze způsobů, jak se této chybě vyhnout, je přesunout logiku z spouště do procedur.
mutační tabulka nastane, když příkaz způsobí spuštění spouštěče a který spustí odkazy na tabulku, která způsobila spuštění. Nejlepším způsobem, jak se těmto problémům vyhnout, je nepoužívat spouště, ale mám podezření, že DBA na to neudělal čas. Mohl udělat jeden z následujících: