Как создать триггер в оракуле, который будет гарантировать, что никакие записи не будут удалены, если дата satrt раньше, чем текущая дата? - PullRequest
2 голосов
/ 12 марта 2012

У меня есть столик Фильм.

create table Movie
(
mv_id number(5),
mv_name varchar2(30),
startdate date
)
insert into Movie values(1,'AVATAR','8-MAR-2012');
insert into Movie values(2,'MI3','20-MAR-2012');
insert into Movie values(3,'BAD BOYS','10-Feb-2012');

Я хочу создать триггер, который будет гарантировать, что никакие записи не будут удалены, если дата сатрита ранее текущей даты. Мой код триггера -

create  or replace  trigger trg_1
before delete
on Movie
for each row
when(old.startdate < sysdate)
begin
raise_application_error(-20001, 'Records can not be deleted');
end;

Триггер создан. Когда я выполняю этот код для удаления данных -

delete from Movie where mv_id=1;

Затем срабатывает триггер, но с ошибками, я не знаю, почему я получаю такую ​​ошибку. Я не хочу никаких ошибок, я хочу только сообщение. Это ошибка -

delete from Movie where mv_id=1
            *
ERROR at line 1: 
ORA-20010: Records can not be deleted
ORA-06512: at "OPS$0924769.TRG_1", line 3 
ORA-04088: error during execution of trigger 'OPS$0924769.TRG_1' 

Я хочу избавиться от этой ошибки.

Ответы [ 2 ]

5 голосов
/ 12 марта 2012

Единственный способ для триггера таблицы предотвратить любую операцию - вызвать исключение. У вас не может быть триггера, который предотвращает DELETE и печатает сообщение.

Вы можете написать триггер, который пытается отобразить сообщение и который позволяет удалить

create  or replace  trigger trg_1
  before delete
  on Movie
  for each row
  when(old.startdate < sysdate)
begin
  dbms_output.put_line( 'Records can not be deleted');
end;

Если клиент настроен на отображение данных, записанных в буфер DBMS_OUTPUT (большинство клиентов не будут), отобразится сообщение. Но это также позволит удалить удачно, что не похоже на то, что вы хотите.

1 голос
/ 30 сентября 2013

Добавьте обработку исключений в вашем операторе удаления.

Все, что вам нужно сделать, это написать оператор delete в своем собственном блоке BEGIN и END и обработать исключение, которое выдается из триггера. Ни одна строка не будет удалена, если она соответствует условию; однако сообщение об отказе в удалении записи будет отображаться с помощью команды DBMS_OUTPUT.

Код ниже делает то, что вы хотите:

BEGIN
DELETE FROM MOVIE WHERE MV_ID = 1;

EXCEPTION
  WHEN OTHERS
    THEN DBMS_OUTPUT.PUT_LINE('Records can not be deleted.');

END;

Вы можете проверить сообщение в окне вывода. Ниже приведен вывод, полученный разработчиком PL / SQL после выполнения указанного выше блока запроса.

Записи не могут быть удалены.

Надеюсь, это поможет.

...