Опять занимаетесь удалением гланд через задницу?
если делать BEFORE триггер FOR EACH ROW, то там просто проверять по таблице OLD значение ключевого поля, и если = 1, то просто ничего не делать, так?
Да, только не "ничего не делать", а вернуть NULL из триггерной функции. Это правильный способ.
а если с помощью AFTER?
AFTER триггеры не предназначены для модификации или отмены операций, обычно они используются для аудита, подсчетов сумм в сводных таблицах и т.п.
Отменить свершившуюся операцию AFTER триггер может, только вызвав исключение (да, откатится весь запрос INSERT/UPDATE/DELETE).
или можно, но только через вставку (INSERT через OLD) этой строки обратно в таблицу просто?
К сожалению, можно. Postgres позволяет ковырять таблицу из триггера на ней. Но это прекрасный способ выстрелить себе в ногу. Например, так можно вызывать бесконечный рекурсивный вызов триггеров. Можно получить неожиданные результаты: так, я, например, не уверен, какое именно состояние таблицы видит FOR EACH ROW триггер (есть сомнения и насчет FOR EACH STATEMENT) - на начало транзакции? операции? или уже после обработки некоторых строк? всех строк?