创建PostgreSQL的一个触发器

问题描述 投票:0回答:2

我想在我的PostgreSQL数据库中创建我的第一个触发器,但我得到了一个syntax error

触发应该能够删除token_jwt_usertoken表的每一行,其中date_informationnow() - 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年2月7日17时14分01秒] [42601] ERROR:语法错误处或附近 “FUNCTION”[2019年2月7日17时14分01秒的位置:92

然后,我不知道如果我的请求被精心写在我的触发。

谢谢 !

sql postgresql triggers database-trigger
2个回答
0
投票

好像你要声明一个函数,并呼吁像他们说:

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


0
投票

据@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

© www.soinside.com 2019 - 2024. All rights reserved.