触发冲突 PL/SQL

Trigger conflict PL/SQL

这3个table是相连的,使用短路键,ID_KOEFICIJENT在table RADNIK通过table RADNO_MESTO。我对触发器有疑问。我认为这是触发器之间的冲突。当我想更新 table RADNIK 时,例如:

update radnik set ID_KOEFICIJENT=3, prezime_ime='Perica Milisav', datum_rodjenja='2020-03-23', 
zanimanje='astronaut', id_radno_mesto=3,stepen_strucne_spreme='7.3', identifikator_casova_rada=7 
where ID_RADNIK=10;

它将更新除 ID_KOEFICIJENT 之外的所有内容,但如果我将 ID_KOEFICIJENT 更改为 UIK_RADNIK,它不会返回触发器的消息4,5,6,7...

Table RADNIK: 主键: ID_RADNIK, 外键: ID_KOEFICIJENT 和ID_RADNO_MESTO

CREATE TABLE "RADNIK"(
"ID_RADNIK" NUMBER(*,0), 
"JMBG" NUMBER(*,0), 
"PREZIME_IME" VARCHAR2(100 BYTE), 
"DATUM_RODJENJA" DATE, 
"ZANIMANJE" VARCHAR2(100 BYTE), 
"STEPEN_STRUCNE_SPREME" VARCHAR2(100 BYTE), 
"IDENTIFIKATOR_CASOVA_RADA" NUMBER(*,0), 
"ID_KOEFICIJENT" NUMBER(*,0), 
"ID_RADNO_MESTO" NUMBER

)

Table RADNO_MESTO: 主键: ID_RADNO_MESTO, 外键: ID_KOEFICIJENT

CREATE TABLE "RADNO_MESTO"(
"ID_RADNO_MESTO" NUMBER(*,0), 
"NAZIV" VARCHAR2(200 BYTE), 
"BR_IZVRSILACA" NUMBER(*,0) DEFAULT 0, 
"DATUM_OD" DATE, 
"DATUM_DO" DATE, 
"ID_KOEFICIJENT" NUMBER(*,0)
)

Table KOEFICIJENT:主键:ID_KOEFICIJENT

CREATE TABLE "KOEFICIJENT"(
"ID_KOEFICIJENT" NUMBER(*,0), 
"BROJ" FLOAT(126), 
"DATUM_OD" DATE, 
"DATUM_DO" DATE
)

此触发器限制直接更新 table RADNIK 中的列 ID_KOEFICIJENT。 触发器:UIK_RADNIK:

create or replace TRIGGER UIK_RADNIK
BEFORE UPDATE OF ID_KOEFICIJENT ON RADNIK 
FOR EACH ROW
BEGIN
    if :new.ID_KOEFICIJENT <> :old.ID_KOEFICIJENT then
        RAISE_APPLICATION_ERROR(-20000, 'Zabranjeno direktno ažuriranje koeficijenta radnika!');
    END IF;
END;

此触发器使用列 ID_RADNO_MESTO 更新 table RADNIK 中的列 ID_KOEFICIJENT。 触发器:UIK_RADNO_MESTO:

create or replace TRIGGER UIK_RADNO_MESTO 
AFTER UPDATE OF ID_KOEFICIJENT ON RADNO_MESTO 
FOR EACH ROW
DECLARE
    PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    EXECUTE IMMEDIATE 'ALTER TRIGGER UIK_RADNIK DISABLE';
        UPDATE RADNIK
        SET ID_KOEFICIJENT = :NEW.ID_KOEFICIJENT
        WHERE ID_RADNO_MESTO = :NEW.ID_RADNO_MESTO;
    EXECUTE IMMEDIATE 'ALTER TRIGGER UIK_RADNIK ENABLE';
END;

触发器:UIRM_RADNIK:

create or replace TRIGGER UIRM_RADNIK 
BEFORE UPDATE OF ID_RADNO_MESTO ON RADNIK 
FOR EACH ROW 
DECLARE
    pragma AUTONOMOUS_TRANSACTION;
    v_id_koeficijent NUMBER;
BEGIN
    SELECT ID_KOEFICIJENT INTO v_id_koeficijent
    FROM RADNO_MESTO
    WHERE ID_RADNO_MESTO = :NEW.ID_RADNO_MESTO;
    :NEW.ID_KOEFICIJENT := v_id_koeficijent;
END;

您可以在触发器中设置执行优先级:

Order of execution of trigger and statements in Oracle stored procedure

您也可以统一 UIK_RADNIK 和 UIRM_RADNIK 触发器: