запускать ПОСЛЕДОВАТЕЛЬНОСТЬ после каждого запроса SELECT

Я создал последовательность и хочу запускать ее после каждого запроса SELECT в таблице.

DROP SEQUENCE IF EXISTS kadry.wyplaty_seq;
CREATE SEQUENCE kadry.wyplaty_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 7771
  CACHE 1;

Поэтому я пытаюсь создать функцию, как показано ниже.

CREATE OR REPLACE FUNCTION kadry.inc_trig()
    RETURNS TRIGGER AS  
$$
BEGIN
    SELECT nextval('kadry.wyplaty_seq');
END;
$$
LANGUAGE 'plpgsql' VOLATILE;

И в конце создайте триггер

DROP TRIGGER IF EXISTS increment_trigger ON kadry.wyplaty;
CREATE TRIGGER increment_trigger AFTER SELECT 
    ON kadry.wyplaty 
    EXECUTE PROCEDURE kadry.inc_trig();

Проблема именно в этой строке

CREATE TRIGGER increment_trigger AFTER SELECT

И я знаю, должно выглядеть так

CREATE TRIGGER increment_trigger AFTER AFTER INSERT OR UPDATE OR DELETE  

Кто-нибудь знает, что мне делать, чтобы запускать мою функцию после каждого запроса SELECT?


person Dominik    schedule 07.12.2020    source источник
comment
Вы не можете активировать триггер на Select. См. документацию).   -  person Belayer    schedule 07.12.2020
comment
Не могли бы вы описать, чего вы пытаетесь достичь с точки зрения бизнеса? Это какой-то аудит?   -  person Lukasz Szozda    schedule 07.12.2020
comment
@Lukasz Szozda Это просто студенческое упражнение, а не часть более крупного проекта. Просто есть небольшая база данных, и мне нужно протестировать какую-то короткую функцию, как в вопросе.   -  person Dominik    schedule 08.12.2020
comment
Итак, ответ: нет, вы не можете использовать для этого триггер.   -  person Lukasz Szozda    schedule 08.12.2020
comment
Вы можете найти ответ на очень похожий вопрос в этот вопрос SO.   -  person Stefanov.sm    schedule 12.12.2020


Ответы (1)


Нет такой вещи, как триггер на SELECT. SELECT по замыслу также не должен иметь побочных эффектов.


Сказав так, вот действительно уродливый способ:

Обертывание запроса функцией:

CREATE OR REPLACE FUNCTION f_wyplaty()
RETURNS TABLE(id INTEGER)
AS $$
DECLARE 
     b    integer;
BEGIN
    b := nextval('wyplaty_seq');
    RETURN QUERY
    SELECT *
    FROM wyplaty;
END
$$ LANGUAGE plpgsql;

И функция запроса вместо таблицы:

SELECT * FROM f_wyplaty();

демонстрация db‹›fiddle

person Lukasz Szozda    schedule 07.12.2020