"Как я могу проанализировать журнал повторов и перехватить sql, который мог вызвать массовое удаление строк? Мой сценарий таков, как только происходит массовое удаление строк"
О каком удалении вы говорите?
УДАЛЕНИЕ ИЗ таблицы, ГДЕ pk IN (1, .... 50) может удалить пятьдесят строк за одно выполнение оператора
FORALL i IN 1..50
DELETE FROM table WHERE pk = i;
будет иметь пятьдесят выполнений, каждое из которых удалит одну строку в одной транзакции.
FOR i IN 1..50 LOOP
DELETE FROM table WHERE pk = i;
COMMIT;
END LOOP;
будет иметь пятьдесят выполнений, каждое из которых удалит одну строку из пятидесяти транзакций за один сеанс.
Так вы ищете удаления более 20 строк в одном операторе, транзакции или сеансе?
Принимая самый простой вариант. Логически, после каждого оператора DELETE вам нужно будет посмотреть количество обработанных строк и, если их больше 20, создать запись аудита.
Технически, способ выполнить такой тест - создать триггер уровня строки AFTER DELETE на таблице. Любая альтернатива будет иметь точно такое же влияние на производительность, как и та же самая работа.
Пределы уровня транзакции или сеанса были бы аналогичными, но вам потребуется триггер, чтобы вести подсчет количества удаленных записей (например, в переменной уровня пакета).