oracle触发点火顺序(碰撞和死点)

时间:2012-03-26 13:16:37

标签: database oracle plsql triggers oracle11g

我有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;
/

2 个答案:

答案 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)

您无法控制语句级触发器触发的顺序。最好的办法是将两者结合成一个触发器。更好的是,尽可能避免使用触发器。