执行提供的代码会导致无限执行。
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;