2009-11-25 4 views
2

Существует некоторый триггер:Как разбить событие триггера?

CREATE OR REPLACE TRIGGER `before_insert_trigger` BEFORE INSERT 

ON `my_table` FOR EACH ROW 

DECLARE `condition` INTEGER:=0; 

BEGIN 

    IF **** THEN 
     condition=1; 
    END IF; 

    IF condition <> 0 THEN  
     --Here I need to break trigger or event or smth to prevent 
     --INSERT to be done  
    END IF; 

END; 

ответ

7

Чтобы предотвратить заявление от успеха, просто вызвать ошибку. Это приведет к откату оператора (каждое утверждение является атомарным, оно терпит неудачу или полностью преуспевает). Вы не потеряете работу, выполненную в этой транзакции, до начала вставки.

Вы можете использовать процедуру raise_application_error, чтобы поднять ошибку.

Вот небольшой пример:

SQL> CREATE TABLE foo (ID NUMBER); 

Table created 

SQL> CREATE OR REPLACE TRIGGER trg BEFORE INSERT ON foo FOR EACH ROW 
    2 BEGIN 
    3  IF :new.id = 2 THEN 
    4  raise_application_error(-20001, 'Id should not be "2"'); 
    5  END IF; 
    6 END; 
    7/

Trigger created 

SQL> INSERT INTO foo (SELECT 1 FROM dual UNION ALL SELECT 2 FROM dual); 

INSERT INTO foo (SELECT 1 FROM dual UNION ALL SELECT 2 FROM dual) 

ORA-20001: Id should not be "2" 
ORA-06512: at "VNZ.TRG", line 3 
ORA-04088: error during execution of trigger 'VNZ.TRG' 

SQL> select * from foo; 

     ID 
---------- 
5

Я хотел бы попробовать сделать все, что мог, чтобы вставить эту логику в состоянии проверки, а не триггер.

+0

Да, если только он не хочет, чтобы поведение было «все или ничего». –

+0

Я не уверен, что я последую за тобой, Джеффри. Можете ли вы расширить это? –

Смежные вопросы