0

执行提供的代码会导致无限执行。

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;

触发器的目的是在插入 StavkaFaktureKD 表期间修改属性 rok_placanja。不能使用 UPDATE 语句直接修改此属性,因为有另一个触发器阻止了这种情况(由于业务逻辑)。当在 StavkaFaktureKD 中插入新记录时,在插入之前,触发器 UnosRokPlacanja 被激活并从 FakturaKupac 表中的引用记录中检索 rok_placanja。检索到的 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;
4

0 回答 0