我有2个插入触发器,它们在同一个表上触发,它们都试图改变表行内容然后发生冲突,或者我的sql开发人员开始无休止地执行命令,然后我需要重启DB。如何解决?我应该将这2个触发器合并为1个触发器吗?或者应该尝试使用此命令控制触发顺序:
execute immediate 'alter trigger trigger_name disable';
execute immediate 'alter trigger trigger_name enable';
或者我应该在触发器内部使用触发器..我想要关于这个的专家意见..我现在正处于大困境,因为这是我第一次进行PL / SQL编码。
编辑:这是我工作的触手:
create or replace
TRIGGER TRG_PROCED_SN_INS_CENA
AFTER INSERT ON STAVKA_NARUDZBENICE
FOR EACH ROW
DECLARE
pragma autonomous_transaction;
sifra_narudzbenice NUMBER;
BEGIN
paket_sn_sifnar.sifra_narudzbenice := :NEW.sifra_narudzbenice;
pStavkaNarudzbeniceInsert(paket_sn_sifnar.sifra_narudzbenice);
COMMIT;
END;
/
create or replace
TRIGGER TRG_SN_INS_UPD_NAZIV
AFTER INSERT ON Stavka_narudzbenice
FOR EACH ROW
FOLLOWS TRG_PROCED_SN_INS_CENA
DECLARE
v_naziv_proizvoda VARCHAR2(25);
v_cena NUMBER;
BEGIN
SELECT naziv_proizvoda INTO v_naziv_proizvoda
FROM proizvod
WHERE sifra_proizvoda=:NEW.sifra_proizvoda;
SELECT cena INTO v_cena
FROM stavka_kataloga
WHERE sifra_proizvoda=:NEW.sifra_proizvoda;
UPDATE stavka_narudzbenice
SET naziv_proizvoda = v_naziv_proizvoda, cena = v_cena WHERE sifra_proizvoda =:NEW.sifra_proizvoda;
END;
/
答案 0 :(得分:4)
在11G中,您可以使用FOLLOWS子句控制触发器的顺序。例如:
CREATE TRIGGER trg1
AFTER INSERT ON EMP
FOR EACH ROW
BEGIN
...
END;
CREATE TRIGGER trg2
AFTER INSERT ON EMP
FOR EACH ROW
FOLLOWS trg1
BEGIN
...
END;
即。有两个触发器trg1和trg2都在表EMP上插入后触发,并且我们声明trg2应该在(跟随)trg1之后触发。
答案 1 :(得分:2)
您无法控制语句级触发器触发的顺序。最好的办法是将两者结合成一个触发器。更好的是,尽可能避免使用触发器。