【问题标题】:oracle triggers firing order (collision, and deadclock )oracle 触发触发顺序(碰撞和死时钟)
【发布时间】:2012-04-09 23:57:06
【问题描述】:

我有 2 个插入触发器,它们在同一个表上触发,它们都尝试更改表行内容然后发生冲突,或者我的 sql 开发人员开始无休止地执行命令,然后我需要重新启动数据库。如何解决?我应该将这 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;
/

【问题讨论】:

    标签: database oracle plsql triggers oracle11g


    【解决方案1】:

    在 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;
    

    即有 2 个触发器 trg1 和 trg2 都在表 EMP 上插入后触发,我们已经声明 trg2 应该在(跟随)trg1 之后触发。

    【讨论】:

    • 是的,我使用 11g 数据库,所以这是触发器内部的执行触发器?
    • 或者你的例子中的trg1会在触发EMP完成执行后执行吗?
    • 变异表错误与您在这些触发器中所做操作的性质有关。
    • tony 你是对的 :) 我可以粘贴我所有的代码,你能检查错误在哪里。我头脑风暴2天,想不通。 :) 我在问题中更新了我的代码,请检查一下。
    • 我想拥抱你... :) 非常感谢。所以这就是更新触发触发器的行的方法,我想把更新命令放到另一个触发器中来做同样的工作。只是一个小的更正,可以帮助这里的其他读者:NEW.naziv_proizvoda := v_naziv_proizvoda; 等号旁边缺少两个点,但那是小错误。能够与像您这样的预言机专家交谈,我感到非常荣幸。感谢感谢感谢,再次感谢!!!! @托尼·安德鲁斯。
    【解决方案2】:

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

    【讨论】:

    • 我无法避免使用触发器,这是一个学校项目,我们都是按书本做的......在这种情况下需要触发器。所以你建议将它们合并到一个触发器中?
    • 那么你必须将它们组合起来。
    • 请记住,这是一项学术活动,在现实生活中应该努力避免它们。您遇到的问题应该是关于触发器会发生什么的教训。
    • 是的,我在他们身上浪费了 2 天时间,信不信由你试图弄清楚它们是如何工作的。我认为我会在应用程序中使用硬核编程技术更快地完成它,然后让触发器代替我来完成工作。 :)
    • 说了我关于触发器的邪恶的文章之后,我不得不说你应该了解它们的工作原理并了解它们适合的场合。
    猜你喜欢
    • 1970-01-01
    • 2022-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多