Автономная_транзакция 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;

0 ответов

Другие вопросы по тегам