Arhn - архитектура программирования

Postgresql: запустить триггер ПОСЛЕ обновления ТОЛЬКО ДЛЯ КАЖДОГО УТВЕРЖДЕНИЯ, если данные изменились

В Postgresql у меня может быть два типа триггеров: FOR EACH ROW и FOR EACH STATEMENT. Если я делаю триггер FOR EACH ROW, я могу добавить предложение WHERE что-то вроде OLD.* != NEW.*, чтобы оно срабатывало только в том случае, если что-то действительно изменилось. Есть ли способ сделать что-то подобное с триггерами уровня STATEMENT? Я знаю, что не могу сделать то же самое, поскольку OLD и NEW недоступны, но я подумал, что, возможно, есть способ проверить количество строк, измененных из самой моей функции или тому подобное.

Пример использования: я использую систему postgresql NOTIFY для уведомления моего приложения об изменении данных. В идеале приложение должно получать одно уведомление каждый раз, когда изменяется одна или несколько записей, и вообще не получать уведомления, если данные остаются прежними (даже если выполнялось ОБНОВЛЕНИЕ). С базовым триггером AFTER UPDATE FOR EACH STATEMENT я получаю уведомления каждый раз, когда запускается оператор обновления, даже если он фактически ничего не меняет.


Ответы:


1

Вы должны создать два триггера: before update for each row и after update for each statement.

Первый триггер проверяет, обновляется ли таблица, и устанавливает флаг, если это так.

Второй триггер проверяет флаг и выполняет notify, если он был установлен.

Вы можете использовать настраиваемый параметр конфигурации в качестве флага (например, flags.the_table). Решение простое и безопасное, так как параметр является локальным в текущем сеансе.

create or replace function before_each_row_on_the_table()
returns trigger language plpgsql
as $$
begin
    if new <> old then
        set flags.the_table to 'on';
    end if;
    return new;
end $$;

create or replace function after_each_statement_on_the_table()
returns trigger language plpgsql
as $$
begin
    if (select current_setting('flags.the_table')) = 'on' then
        notify your_channel, 'the_table was updated';
        set flags.the_table to 'off';
    end if;
    return null;
exception
    when undefined_object then
        -- occurs when flags.the_table was not defined
        return null;
end $$;

create trigger before_each_row_on_the_table
before update on the_table
for each row execute procedure before_each_row_on_the_table();

create trigger after_each_statement_on_the_table
after update on the_table
for each statement execute procedure after_each_statement_on_the_table();
25.08.2015
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..