【问题标题】:Oracle row trigger to compound triggerOracle 行触发器到复合触发器
【发布时间】:2022-01-13 19:12:43
【问题描述】:

我在从行触发器制作复合触发器时遇到问题,或者如果有人有比复合触发器更好的解决方案,我想听听。想法是当有人更新 'KONTAKT' 表中的列 'kupac_pib' 触发触发器时,这将更改 'KONTAKT' 表中的 'naziv_firme_kupac',但 naziv_firme_kupac 来自 'KUPAC' 表。

错误是 ORA-04091:表 C##NIKOLA.KONTAKT 正在变异,触发器/函数可能看不到它

CREATE TABLE Kupac (
    kupac_PIB INT PRIMARY KEY,
    naziv_firme_kupac VARCHAR2(255)
);

CREATE TABLE Kontakt (
    id_kontakt INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    mail VARCHAR2(100),  
    telefon VARCHAR2(100),
    kupac_PIB INT, 
    partner_PIB INT, 
    naziv_firme_kupac VARCHAR2(255),
    naziv_poslovni_partner VARCHAR2(255),
    CONSTRAINT kontakt_kupac
        FOREIGN KEY(kupac_PIB)
        REFERENCES Kupac(kupac_PIB),
    CONSTRAINT kontakt_pPartner
        FOREIGN KEY(partner_PIB)
        REFERENCES PPartner(partner_PIB)
);

CREATE OR REPLACE TRIGGER IzmenaNazivaKupcaNaOsnovuPIB_a
AFTER UPDATE OF kupac_PIB ON Kontakt
FOR EACH ROW
DECLARE
noviNazivKupca VARCHAR2(255);
kupac_PIB_tmp INT;
    BEGIN
        noviNazivKupca:= :new.naziv_firme_kupac;
        kupac_PIB_tmp := :new.kupac_PIB;
        UPDATE Kontakt
        SET naziv_firme_kupac = noviNazivKupca
        WHERE kupac_PIB_tmp = (SELECT kupac_PIB FROM Kupac
        WHERE kupac_PIB_tmp = kupac_PIB);
    END;

【问题讨论】:

    标签: oracle triggers


    【解决方案1】:

    您需要将触发器更新为 -

    CREATE OR REPLACE TRIGGER IzmenaNazivaKupcaNaOsnovuPIB_a
    BEFORE UPDATE OF kupac_PIB ON Kontakt
    FOR EACH ROW
    DECLARE
    kupac_PIB_tmp VARCHAR2(255);
    BEGIN
            SELECT naziv_firme_kupac
              INTO kupac_PIB_tmp
              FROM Kupac
             WHERE kupac_PIB = :new.kupac_PIB;
             
            :new.naziv_firme_kupac := kupac_PIB_tmp;
    END;
    /
    

    Demo.

    【讨论】:

    • 感谢您的快速回复,更新后触发错误仍然和以前一样:(
    • @NikolaStanojevic,请您尝试编辑后的版本,我已将您的触发器从 After trigger 更改为 Before trigger。
    • 嘿,它工作。谢谢!
    • @NikolaStanojevic,永远欢迎。
    猜你喜欢
    • 1970-01-01
    • 2011-05-11
    • 2020-12-30
    • 2011-01-01
    • 2016-05-21
    • 2015-09-18
    • 2020-06-17
    • 1970-01-01
    • 2013-02-09
    相关资源
    最近更新 更多