Postgres - удалить запись после триггера

У меня есть таблица postgres с некоторыми триггерами, которые срабатывают, если записи обновляются или удаляются. Они в основном архивируют записи, поэтому они не удаляются по-настоящему - они просто изменяют определенные атрибуты, поэтому записи не отображаются в соответствующих представлениях.

Иногда я хочу вручную удалить запись навсегда, но я не могу этого сделать, потому что триггер срабатывает и делает это, если я выполняю запрос DELETE.

Пример: DELETE FROM records WHERE operator = 20

Есть ли способ запустить запрос DELETE и обойти триггер, срабатывающий при DELETE?


person Marin Leontenko    schedule 21.02.2019    source источник


Ответы (1)


При такой настройке я думаю, что типичный подход состоит в том, чтобы избежать предоставления каких-либо прямых привилегий для базовой таблицы и поместить триггеры INSERT / UPDATE / DELETE в представление (позволяя владельцу таблицы изменять его по мере необходимости).

Если вы являетесь владельцем таблицы, вы можете использовать ALTER TABLE для временного DISABLE и повторно ENABLE триггер. Пока вы делаете все это внутри транзакции, вы будете защищены от одновременных DELETE, хотя они будут блокироваться до тех пор, пока ваша транзакция не будет зафиксирована.

Если у вас есть привилегии суперпользователя, вы также можете предотвратить срабатывание триггеров, установив _ 8_ до replica, при условии, что рассматриваемый триггер не настроен для срабатывания в реплицированных базах данных.

person Nick Barnes    schedule 21.02.2019
comment
Я думаю, что способ отключения / включения триггера - это то, что вам нужно. Возможно, вы сможете использовать функцию логического декодирования в новых версиях PostgreSQL для записи журнала аудита (в отдельную таблицу) - без постоянного запуска дорогостоящих триггеров. Таким образом, вы можете без проблем удалять записи из таблицы аудита. - person A. Scherbaum; 22.02.2019