@Melnik228

Как в триггере вернуть одну удаленную строку в таблицу?

допустим можно удалять любые строки из таблицы, кроме какой-то определенной со значением ключевого поля = 1

если делать BEFORE триггер FOR EACH ROW, то там просто проверять по таблице OLD значение ключевого поля, и если = 1, то просто ничего не делать, так?

а если с помощью AFTER?
то как тут, если строка уже удалена (можно проверить также через OLD или через саму таблицу) - то откатить можно только всю транзакцию? то есть вернуться и другие строки, у которых поле != 1?
вот нельзя вернуть только ту, у которой = 1?
или можно, но только через вставку (INSERT через OLD) этой строки обратно в таблицу просто?
  • Вопрос задан
  • 141 просмотр
Решения вопроса 1
@galaxy
Опять занимаетесь удалением гланд через задницу?

если делать BEFORE триггер FOR EACH ROW, то там просто проверять по таблице OLD значение ключевого поля, и если = 1, то просто ничего не делать, так?

Да, только не "ничего не делать", а вернуть NULL из триггерной функции. Это правильный способ.

а если с помощью AFTER?

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

или можно, но только через вставку (INSERT через OLD) этой строки обратно в таблицу просто?

К сожалению, можно. Postgres позволяет ковырять таблицу из триггера на ней. Но это прекрасный способ выстрелить себе в ногу. Например, так можно вызывать бесконечный рекурсивный вызов триггеров. Можно получить неожиданные результаты: так, я, например, не уверен, какое именно состояние таблицы видит FOR EACH ROW триггер (есть сомнения и насчет FOR EACH STATEMENT) - на начало транзакции? операции? или уже после обработки некоторых строк? всех строк?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы