A перед оператором триггер слишком ранний, чтобы узнать затронутые строки.
Что касается полного удаления таблицы , используйте после триггера оператора . Все, что вам нужно сделать, это выбрать из таблицы и посмотреть, есть ли в ней какая-то запись.
Что касается удалений до n записей , это тоже должно быть определено после оператора . Вы пометили свой вопрос PostgreSQL, но, как указывает a_horse_with_no_name, ваш код - Oracle. В PostgreSQL вы хотите проверить pg_affected_rows()
, а в Oracle SQL%ROWCOUNT
. Я не знаю, позволяет ли PostgreSQL проверять pg_affected_rows()
в триггере после оператора. Для Oracle проверка SQL%ROWCOUNT
в триггере после оператора не работает. Эта переменная еще слишком рано проверяется.
Так что, по крайней мере, для Oracle хитрость заключается в том, чтобы какой-то пользовательский счетчик установить на ноль перед оператором , увеличить после каждой строки и проверить после оператора . Я не знаю точно, как это сделать в PostgreSQL, но, безусловно, найдется способ. В Oracle вы бы использовали составной триггер, то есть супер-триггер, содержащий отдельные триггеры.
CREATE OR REPLACE TRIGGER prevent_multiple_row_del
FOR DELETE ON mytable COMPOUND TRIGGER
v_count INTEGER := 0;
AFTER EACH ROW IS
BEGIN
v_count := v_count + 1;
END AFTER EACH ROW;
AFTER STATEMENT IS
BEGIN
IF v_count > 1 THEN
raise_application_error(-20000, 'Can''t delete more than 1 row at a time');
END IF;
END AFTER STATEMENT;
END prevent_multiple_row_del;