Как предотвратить массовое удаление строк? - PullRequest
0 голосов
/ 07 сентября 2018

Я могу полностью удалить DELETE следующим образом:

CREATE TRIGGER prevent_multiple_row_del
BEFORE DELETE ON ALL
BEGIN
RAISE EXCEPTION 'Cant delete more than 1 row at a time';
END;

Но как мне проверить, приведет ли операция удаления к удалению нескольких строк?Удаление не является проблемой, если оно ограничено постоянным числом (1, 5 или 10, если оно не ограничено).

В качестве альтернативы, как разрешить удаление, но предотвратить удаление полных таблиц?

1 Ответ

0 голосов
/ 10 сентября 2018

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...