Создать TRIGGER с PostgreSQL - PullRequest
       9

Создать TRIGGER с PostgreSQL

0 голосов
/ 07 февраля 2019

Я хотел бы создать свой первый триггер в моей базе данных PostgreSQL, но я получил syntax error.

Триггер должен иметь возможность удалять каждую строку из таблицы token_jwt_usertoken, где date_informationниже now() - interval '2 month'.Другими словами, если срок действия строки истекает как минимум через 2 месяца, ее следует удалить.

Это моя команда:

CREATE FUNCTION after_update_token() RETURNS TRIGGER AS $after_update_token$


BEGIN
    IF old.date_information < now() - INTERVAL '2 month'
      THEN
        DELETE FROM token_jwt_usertoken WHERE old.date_information < now() - INTERVAL '2 month';
    END IF;
END;

$after_update_token$ LANGUAGE plpgsql;

CREATE TRIGGER after_update_token AFTER UPDATE ON token_jwt_usertoken FOR EACH ROW EXECUTE FUNCTION after_update_token();

Я получаю:

[2019-02-07 17:14:01] [42601] ОШИБКА: синтаксическая ошибка в или около «FUNCTION» [2019-02-07 17:14:01] Позиция: 92

Тогда я не знаю, правильно ли написан мой запрос в моем триггере.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Согласно ответу @lau, это код, который решает мою проблему:

CREATE FUNCTION after_update_token() RETURNS TRIGGER AS $after_update_token$
  BEGIN
    IF to_timestamp(old.date_information, 'YYYY/MM/DD') < now() - INTERVAL '2 month'
      THEN
        DELETE FROM token_jwt_usertoken WHERE to_timestamp(old.date_information, 'YYYY/MM/DD') < now() - INTERVAL '2 months';
    END IF;
END;

$after_update_token$ LANGUAGE plpgsql;

CREATE TRIGGER after_update_token AFTER UPDATE ON token_jwt_usertoken FOR EACH ROW EXECUTE PROCEDURE after_update_token();

Я должен был написать: FOR EACH ROW EXECUTE PROCEDURE вместо FOR EACH ROW EXECUTE FUNCTION

0 голосов
/ 07 февраля 2019

Похоже, вы должны объявить функцию и вызвать, как они говорят:

CREATE [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] }
    ON table
    [ FROM referenced_table_name ]
    [ NOT DEFERRABLE | [ DEFERRABLE ] { INITIALLY IMMEDIATE | INITIALLY DEFERRED } ]
    [ FOR [ EACH ] { ROW | STATEMENT } ]
    [ WHEN ( condition ) ]
    EXECUTE PROCEDURE function_name ( arguments )

where event can be one of:

    INSERT
    UPDATE [ OF column_name [, ... ] ]
    DELETE
    TRUNCATE

https://www.postgresql.org/docs/9.1/sql-createtrigger.html

...