触发冲突 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 触发器:
这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 触发器: