Tenho as duas tabelas a seguir:
CREATE TABLE entries
(
id NUMBER(20, 0) NOT NULL PRIMARY KEY,
first_name VARCHAR2(512) DEFAULT NULL NULL,
last_name VARCHAR2(512) DEFAULT NULL NULL,
last_updated_at TIMESTAMP DEFAULT NULL NULL
);
CREATE TABLE entry_details
(
id NUMBER(20, 0) NOT NULL PRIMARY KEY,
entry_id NUMBER(20, 0) NOT NULL,
value VARCHAR2(512) DEFAULT NULL NULL,
CONSTRAINT fk_details_entry_id FOREIGN KEY (entry_id) REFERENCES entries(id) ON DELETE CASCADE
);
Preciso atualizar last_updated_at
sempre que houver uma alteração/exclusão na tabela entries
or entry_details
, então tenho esta trigger:
CREATE OR REPLACE TRIGGER detail_delete_trigger
BEFORE DELETE
ON entry_details
FOR EACH ROW
BEGIN
UPDATE entries
SET last_updated_at = CURRENT_TIMESTAMP
WHERE id = :OLD.entry_id;
END;
Isso funciona bem quando há uma exclusão entry_details
diretamente. No entanto, recebo o
ORA-04091: entries table is mutating
erro quando há exclusão da entries
tabela que se propaga para entry_details
. Eu tentei:
PRAGMA AUTONOMOUS_TRANSACTIONS
que cede aORA-00060: deadlock detected while waiting for resource
- Usando uma
AFTER DELETE
trigger, que deu novamente, a tabela está com erro de mutação - Não foi possível usar
INSTEAD OF DELETE
porque não é para tabelas conformeORA-25002: cannot create INSTEAD OF triggers on tables
- Eu removi
CASCADE
e adicionei o seguinte gatilho:
ALTER TABLE entry_details DROP CONSTRAINT fk_details_entry_id;
ALTER TABLE entry_detailsADD CONSTRAINT fk_details_entry_idFOREIGN KEY (entry_id) REFERENCES entries(id);
CREATE OR REPLACE TRIGGER aml_entries_delete_trigger
BEFORE DELETE -- or AFTER DELETE, same result
ON entries
FOR EACH ROW
BEGIN
DELETE FROM entry_details WHERE entry_id = :OLD.id;
END;
Mas ainda recebo o ORA-04091 table is mutating trigger/function may not see
erro. Como faço para superar isso?
Talvez você possa usar um sinalizador que é definido quando uma linha na tabela pai é excluída e desativada após suas exclusões. Você pode tentar o seguinte código:
com dados de teste
Agora tente deletar
Isso atualizará a linha pai.