По-видимому, невозможно использовать триггер, чтобы остановить вставки, не вызывая исключение.
Однако, если у вас есть доступ к схеме (и вопрос о триггере это, вероятно, нормально), вы могли быподумайте о замене таблицы представлением и триггером вместо.
Как минимальный макет для вашей текущей таблицы.myrole
- это просто замена привилегий, предоставленных для таблицы:
CREATE ROLE myrole;
CREATE TABLE mytable (
bar VARCHAR2(30)
);
GRANT ALL ON mytable TO myrole;
Теперь вы переименовываете таблицу и убеждаетесь, что никто больше не сможет получить к ней прямой доступ, и замените ее представлением.Это представление может быть защищено вместо триггера:
REVOKE ALL ON mytable FROM myrole;
RENAME mytable TO myrealtable;
CREATE OR REPLACE VIEW mytable AS SELECT * FROM myrealtable;
GRANT ALL ON mytable TO myrole;
CREATE OR REPLACE TRIGGER myioftrigger
INSTEAD OF INSERT ON mytable
FOR EACH ROW
BEGIN
IF :new.bar = 'FOO' THEN
NULL;
ELSE
INSERT INTO myrealtable(bar) VALUES (:new.bar);
END IF;
END;
/
Итак, если кто-то вставляет нормальную строку в поддельное представление, данные вставляются в вашу реальную таблицу:
INSERT INTO mytable(bar) VALUES('OK');
1 row inserted.
SELECT * FROM mytable;
OK
Но если кто-то вставляет магическое значение 'FOO', триггер молча глотает его, и в реальной таблице ничего не меняется:
INSERT INTO mytable(bar) VALUES('FOO');
1 row inserted.
SELECT * FROM mytable;
OK
Внимание: если вы хотите защитить свою таблицу также от ОБНОВЛЕНИЙвам нужно будет добавить второй триггер для обновлений.