оракул запускает порядок срабатывания (столкновение и тупик) - PullRequest
0 голосов
/ 26 марта 2012

У меня есть 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;
/

Ответы [ 2 ]

4 голосов
/ 26 марта 2012

В 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 должен сработать после (follow) trg1.

2 голосов
/ 26 марта 2012

Вы не можете контролировать порядок, в котором уровень оператора вызывает срабатывание.Лучше всего объединить два в один триггер.Еще лучше избегать использования триггеров, если это вообще возможно.

...