У меня есть таблица:
create table projects(pid int,name char(10),active int);
insert into projects values(1,'aa',1);
insert into projects values(2,'bb',0);
, и я хочу создать триггер, который не позволяет удалить активный проект (active = 1). Таким образом, для команды: delete from projects where pid in (1,2)
будет удалена только строка с pid = 2, а строка с pid = 1 не будет удалена . И об ошибке не будет сообщено (может быть, только предупреждение?).
На SQL Сервере Я делаю это так:
create trigger nondel on projects instead of DELETE
as
delete from projects where pid in (select pid from deleted where active=0)
end
Так что «вместо» триггера и только строки которые выполняют условие удаления и условие active = 0 удаляются.
В Oracle я пробовал «для каждого» триггера:
create trigger nondel before delete on projects
for each row
when :old.active=1
begin
RAISE_APPLICATION_ERROR (-20502, 'Active rows cannot be deleted!');
end
, но RAISE_APPLICATION_ERROR прерывает всю транзакцию, и ничего не происходит удален. Мой вопрос: возможно ли объявить триггер «для каждой строки» с кодом, который, когда условие выполняется, не удаляет строку, но и не вызывает никакой ошибки, просто продолжает с последующими строками? Или, может быть, лучше использовать триггер оператора?