Чтобы предотвратить заявление от успеха, просто вызвать ошибку. Это приведет к откату оператора (каждое утверждение является атомарным, оно терпит неудачу или полностью преуспевает). Вы не потеряете работу, выполненную в этой транзакции, до начала вставки.
Вы можете использовать процедуру 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
----------
Да, если только он не хочет, чтобы поведение было «все или ничего». –
Я не уверен, что я последую за тобой, Джеффри. Можете ли вы расширить это? –