Вам не нужно вставлять в триггер вставки.
Если триггер успешен, Oracle продолжит работу с INSERT самостоятельно.
Поэтому немедленное решение - удалить INSERT из триггера:
CREATE OR REPLACE TRIGGER mona_internal.PROBA_PROBA
BEFORE INSERT ON OFFICIUS_UNOS
FOR EACH ROW
DECLARE
task_provera number(10);
BEGIN
select id
into task_provera
from servis.task
where id=:new.task;
if (task_provera is null) then
raise_application_error(-20101, 'No task');
end if;
// nothing do do here
END;
Однаковыше все еще не правильно.Если id
не существует в servis.tak
, SELECT выдаст исключение NO_DATA_FOUND
.
Одним из решений этой проблемы является использование агрегатной функции, которая всегда будет возвращать одну строку.Если ни одна строка не соответствует критерию WHERE, возвращается значение NULL:
CREATE OR REPLACE TRIGGER mona_internal.PROBA_PROBA
BEFORE INSERT ON OFFICIUS_UNOS
FOR EACH ROW
DECLARE
task_provera number(10);
BEGIN
select max(id)
into task_provera
from servis.task
where id=:new.task;
if (task_provera is null) then
raise_application_error(-20101, 'No task');
end if;
// nothing do do here
END;
Или вы можете явно перехватить исключение:
CREATE OR REPLACE TRIGGER mona_internal.PROBA_PROBA
BEFORE INSERT ON OFFICIUS_UNOS
FOR EACH ROW
DECLARE
task_provera number(10);
BEGIN
select max(id)
into task_provera
from servis.task
where id=:new.task;
if (task_provera is null) then
raise_application_error(-20101, 'No task');
end if;
EXCEPTION
WHEN NOT_DATA_FOUND THEN
raise_application_error(-20101, 'No task');
END;
Но правильный подход - использоватьограничение внешнего ключа для чего-то подобного.
alter table mona_internal.PROBA_PROBA
add constraint fk_proba_task
foreign key (task)
references servis.task (id);
Тогда вам вообще не нужен триггер.
Для этого требуется, чтобы пользователь mona_internal
не только получил SELECT
привилегия для servis.task, но также привилегия references
:
Для этого запустите следующее как пользователь SERVIS
:
grant references on task to mona_internal;