Автономная_транзакция Oracle 21c PRAGMA вызывает бесконечное выполнение
Выполнение предоставленного кода вызывает бесконечное выполнение.
CREATE TRIGGER UnosRokPlacanja
BEFORE INSERT ON StavkaFaktureKD
REFERENCING NEW AS NEW
FOR EACH ROW
DECLARE
rok_placanja_temp DATE;
pragma autonomous_transaction;
BEGIN
SELECT rok_placanja
INTO rok_placanja_temp
FROM FakturaKupac
WHERE broj_fakture_kupac = :new.broj_fakture_kupac;
EXECUTE IMMEDIATE 'ALTER TRIGGER ZABRANAPROMENEROKAPLACANJA DISABLE';
:new.rok_placanja := rok_placanja_temp;
EXECUTE IMMEDIATE 'ALTER TRIGGER ZABRANAPROMENEROKAPLACANJA ENABLE';
COMMIT;
END;
Назначение триггера — изменить свойство rok_placanja во время вставки в таблицу StavkaFaktureKD. Это свойство нельзя изменить напрямую с помощью оператора UPDATE, поскольку существует другой триггер, который предотвращает это (из-за бизнес-логики). Когда новая запись вставляется в StavkaFaktureKD, перед вставкой активируется триггер UnosRokPlacanja, который извлекает rok_placanja из указанной записи в таблице FakturaKupac. Полученный rok_placanja заменит rok_placanja новой записи.
Я собираюсь предоставить еще несколько сценариев, чтобы сделать проблему воспроизводимой.
CREATE TABLE FakturaKupac (
broj_fakture_kupac INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
kupac_PIB INT not null,
broj_ponude INT not null,
broj_racuna NUMBER,
rok_placanja DATE,
datum_dokumenta DATE,
ukupna_cena NUMBER,
CONSTRAINT faktura_kupac_kupac
FOREIGN KEY(kupac_PIB, broj_ponude)
REFERENCES PonudaKupac(kupac_PIB, broj_ponude)
);
CREATE TABLE StavkaFaktureKD (
broj_stavke INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
broj_fakture_kupac INT not null,
kolicina NUMBER,
jedinicna_cena NUMBER,
rok_placanja DATE,
CONSTRAINT broj_fakture_kd_stavka_fakture
FOREIGN KEY(broj_fakture_kupac)
REFERENCES FakturaKupac(broj_fakture_kupac)
);
CREATE OR REPLACE TRIGGER ZabranaPromeneRokaPlacanja
BEFORE UPDATE OF rok_placanja ON StavkaFaktureKD
BEGIN
RAISE_APPLICATION_ERROR(-20001,'Nije moguca izmena vrednosti roka placanja!');
END;