Как создать триггер для проверки обновленного значения поля - PullRequest
0 голосов
/ 18 апреля 2019

Создайте триггер с именем products_before_update, который проверяет новое значение для столбца discount_percent таблицы Products.Этот триггер должен вызвать соответствующую ошибку, если процент скидки больше 100 или меньше 0. Если новый процент скидки находится между 0 и 1, этот триггер должен изменить новый процент скидки, умножив его на 100. Таким образом, скидкапроцентов от .2 становится 20. Протестируйте этот триггер с помощью соответствующего оператора UPDATE.

Либо, если оператор не работает, или я получаю сообщение о том, что таблица мутирует, поэтому триггер не может ее увидеть ..

connect mgs/mgs;
CREATE or replace TRIGGER products_before_update
    BEFORE UPDATE ON Products
    FOR EACH ROW IS
BEGIN
    IF :NEW.discount_percent > 100 THEN
        RAISE_APPLICATION_ERROR(-20001, 'the discount percent cannot be greater than 100.');
    ELSEIF :new.discount_percent < 0 THEN
        RAISE_APPLICATION_ERROR(-20001, 'the discount percent cannot be less than 0.');
    ELSEIF :NEW.discount_percent < 1 THEN
        SET :NEW.discount_percent = (:NEW.discount_percent * 100);
    END IF;
END;
/


SET SERVEROUTPUT ON;

UPDATE Products
SET discount_percent = .4
WHERE product_id = 3;

Я ожидаю сообщения, после чего значение выходит за [0,100] или обновляется, когда оно было (0; 1), но триггер не реагирует ни в коем случае.

1 Ответ

0 голосов
/ 18 апреля 2019

Вот пример, который работает. Посмотри.

Сначала тестовый пример:

SQL> create table products (product_id number, discount_percent number);

Table created.

SQL> insert into products values (12345, null);

1 row created.

SQL> create or replace trigger trg_prod_bu
  2    before update on products
  3    for each row
  4  begin
  5    if :new.discount_percent > 100 then
  6       raise_application_error(-20001, 'can not be greater than 100');
  7    elsif :new.discount_percent < 0 then
  8       raise_application_error(-20002, 'can not be less than 0');
  9    elsif :new.discount_percent < 1 then
 10       :new.discount_percent := :new.discount_percent * 100;
 11    end if;
 12  end;
 13  /

Trigger created.

SQL>

Тестирование:

SQL> update products set discount_percent = -2;
update products set discount_percent = -2
       *
ERROR at line 1:
ORA-20002: can not be less than 0
ORA-06512: at "SCOTT.TRG_PROD_BU", line 5
ORA-04088: error during execution of trigger 'SCOTT.TRG_PROD_BU'


SQL> update products set discount_percent = 120;
update products set discount_percent = 120
       *
ERROR at line 1:
ORA-20001: can not be greater than 100
ORA-06512: at "SCOTT.TRG_PROD_BU", line 3
ORA-04088: error during execution of trigger 'SCOTT.TRG_PROD_BU'


SQL> update products set discount_percent = 15;

1 row updated.

SQL> update products set discount_percent = 0.2;

1 row updated.

SQL> select * From products;

PRODUCT_ID DISCOUNT_PERCENT
---------- ----------------
     12345               20

SQL>
...