В основном, у меня есть эти 2 таблицы:
CREATE TABLE Aposta (
codMovimento number(10)
references Movimento(codMovimento),
Primary key(codMovimento),
data DATE default sysdate not null,
valor Number(10,2) not null,
quotaTotal Number(10,2) not null,
CodTipoAposta Number(1) not null
references TipoAposta(CodTipoAposta)
CodEstadoAposta Number(1)
references EstadoAposta(CodEstadoAposta)
);
CREATE TABLE LinhaAposta (
CodMovimento Number(10)
references Movimento(CodMovimento),
CodEvento Number(10)
references Evento(CodEvento),
Primary key(CodMovimento,CodEvento),
quota Number(10,2) not null,
resultado VARCHAR2(1) not null
check (resultado in ('1','X','2'))
);
Я создал этот триггер BEFORE DELETE, чтобы разделить значение quotaTotal на удаляемое значение квоты. Также необходимо обновить значение codTipoAposta на основе количества строк таблицы linhaaposta. Я уже пытался сделать это ПОСЛЕ УДАЛЕНИЯ, но та же ошибка появляется в выводе скрипта, а также пробовал: NEW вместо: OLD.
Trigger:
create or replace TRIGGER update_Quota_Estado2
BEFORE DELETE ON linhaaposta
FOR EACH ROW
DECLARE
updateCount number(3);
BEGIN
UPDATE Aposta SET quotaTotal= quotaTotal / :OLD.quota WHERE codMovimento = :OLD.codMovimento;
SELECT COUNT(*) INTO updateCount FROM linhaaposta WHERE codMovimento = :OLD.codMovimento;
IF (updateCount = '0') THEN
UPDATE Aposta SET codTipoAposta = 0 WHERE codMovimento = :OLD.codMovimento;
END IF;
IF (updateCount >= '1') THEN
UPDATE Aposta SET codTipoAposta = 1 WHERE codMovimento = :OLD.codMovimento;
END IF;
END;
Я сделал аналогичный триггер BEFORE INSERT, который отлично работает, но работает наоборот, умножает значение, вставленное в квоту, и обновляет его до quotaTotal в таблице Aposta.
Вот этот триггер:
CREATE OR REPLACE TRIGGER update_Quota_Estado
BEFORE INSERT ON linhaaposta
FOR EACH ROW
DECLARE
updateCount number(3);
BEGIN
UPDATE Aposta SET quotaTotal= quotaTotal * :NEW.quota WHERE codMovimento = :NEW.codMovimento;
SELECT COUNT(*) INTO updateCount FROM linhaaposta WHERE codMovimento = :NEW.codMovimento;
IF (updateCount = '0') THEN
UPDATE Aposta SET codTipoAposta = 0 WHERE codMovimento = :NEW.codMovimento;
END IF;
IF (updateCount >= '1') THEN
UPDATE Aposta SET codTipoAposta = 1 WHERE codMovimento = :NEW.codMovimento;
END IF;
END;
Всякий раз, когда 1-й триггер активирован, это вывод скрипта:
Error starting at line : 22 in command -
DELETE FROM linhaaposta where codEvento=1
Error report -
ORA-04091: table LUIS.LINHAAPOSTA is mutating, trigger/function may not see it
ORA-06512: at "LUIS.UPDATE_QUOTA_ESTADO2", line 5
ORA-04088: error during execution of trigger 'LUIS.UPDATE_QUOTA_ESTADO2'
Из того, что я тестировал, он только перестает работать, начиная с SELECT, пробовал без него и связанных с ним IF, и это работало.
Чего не хватает / что мне делать?