• Есть ли в триггерах уровня оператора переменные наподобие NEW и OLD?

    @galaxy
    Да, для AFTER STATEMENT триггеров есть:
    CREATE TRIGGER transfer_insert
        AFTER UPDATE ON transfer
        REFERENCING NEW TABLE AS newtab OLD TABLE AS oldtab
        FOR EACH STATEMENT
        EXECUTE FUNCTION check_transfer_balances_to_zero();

    В функции check_transfer_balances_to_zero будут доступны таблицы newtab и oldtab.

    (Согласно документации указывать REFERENCING можно и для ROW триггеров. Как в этом случае оно работает, не знаю)
    Ответ написан
    2 комментария
  • Как в триггере вернуть одну удаленную строку в таблицу?

    @galaxy
    Опять занимаетесь удалением гланд через задницу?

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

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

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

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

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

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

    Melkij
    @Melkij
    PostgreSQL DBA
    Написали, что last_name должно начинаться со строки [А-я] - так и проверяется.
    melkij=> select '[A]ds' like '[A]%';
    ?column?
    ----------
    t
    (1 строка)


    Куда вам query rewrite system, если вы регулярки от like не отличаете?
    Зачем not valid лучше даже не буду спрашивать.
    Ответ написан
    4 комментария
  • Почему не создается правило с IF?

    Melkij
    @Melkij
    PostgreSQL DBA
    Почему вы решили, что такой синтаксис существует?
    Почему вы решили, что вам нужны rule?

    Вам нужен check constraint.
    Для локализованного сообщения пользователю - проверка на backend'е вашего приложения. Ну или, если оочень хочется, запретить прямые изменения таблиц и общаться с пользователем базы только через хранимки.
    Ответ написан