Co To Jest Tabela Mutująca

Pod tą enigmatyczną nazwą nie kryje się żaden tajemny typ tabeli bazodanowej. O tabeli mutującej mówimy wówczas kiedy w triggerze próbujemy pobrać dane z tabeli, na której ten trigger istnieje i została wykonana instrukcja DML. Brzmi zawile, ale za chwilę na przykładzie zaprezentuje, o co tak naprawdę chodzi.

Aby zaprezentować przykład tabeli mutującej, potrzebujemy tabeli, triggera i instrukcji DML. Całość może wyglądać następująco:

CREATE TABLE tab_mut( id NUMBER, VALUE NUMBER)
/

CREATE TRIGGER tr_tab_mut_ai
AFTER INSERT
ON tab_mut
REFERENCING NEW AS new OLD AS old
FOR EACH ROW
DECLARE
v_tmp NUMBER;
BEGIN
SELECT SUM(VALUE)
INTO v_tmp
FROM tab_mut;
END;
/

INSERT INTO tab_mut VALUES (1, 100)
/

Po wykonaniu instrukcji DML dostajemy błąd taki jak poniżej. Dzieje się tak ze względu na to, że podczas sumowania wartości (kolumna VALUE), trigger jeszcze nie widzi wprowadzonej wartości.

Gdyby błąd nie został zwrócony, to zmienna v_tmp w trigerze będzie NULL’em, mimo iż przed chwilą wstawiliśmy do tabeli rekord z wartością 100.

Error starting at line : 18 in command -
INSERT INTO tab_mut VALUES (1, 100)
Error report -ORA-04091: tabela FN.TAB_MUT ulega mutacji, wyzwalacz/funkcja może tego nie widzieć ORA-06512: przy "FN.TR_TAB_MUT_AI", linia 4ORA-04088: błąd w trakcie wykonywania wyzwalacza 'FN.TR_TAB_MUT_AI'

Na szczęście ten przypadek można łatwo obejść tworząc COMPOUND trigger. Ale to już zupełnie inna historia.

//