У меня было несколько горьких опытов с правилами при работе с энергозависимыми функциями (если память не изменяет, некоторые из них в блоге depesz освещаются).
Я также нарушил ссылочную целостность при их использовании из-за времени срабатывания триггеров fkey:
CREATE OR REPLACE RULE protected_example AS
ON DELETE TO example
WHERE OLD.protected
DO INSTEAD NOTHING;
... затем добавьте другую таблицу и сделайте пример, ссылающийся на эту таблицу с помощью внешнего ключа каскада при удалении. Затем удалите * из этой таблицы ... и в ужасе отпряните.
Я сообщил о вышеупомянутой проблеме как об ошибке, которая была отклонена как особенность / необходимый крайний случай. Лишь несколько месяцев спустя я понял, почему это может быть, то есть триггер fkey выполняет свою работу, а затем правило срабатывает и действует самостоятельно, но триггер fkey не будет проверять, что его работа была выполнена правильно из соображений производительности. .
Практический случай использования, где я все еще использую правила, - это когда BEFORE
триггер, который предварительно манипулирует данными (стандарт SQL говорит, что это не разрешено, но Postgres с радостью выполнит обязательство), может привести к предварительной манипуляции с затронутыми строками и изменяя таким образом их ctid (то есть он обновляется дважды или не удаляется, потому что обновление делает недействительным удаление).
Это приводит к тому, что Postgres возвращает неверное количество затронутых строк, что не составляет особого труда, пока вы не проконтролируете это число перед выполнением последующих операторов.
В этом случае я обнаружил, что использование стратегически размещенного правила или двух может позволить превентивно выполнить ошибочные операторы, в результате чего Postgres вернет правильное количество затронутых строк.