【问题标题】:Getting error in creating trigger function using PostgreSQL?使用 PostgreSQL 创建触发器函数时出错?
【发布时间】:2020-02-25 11:40:24
【问题描述】:

我正在创建一个触发函数来自动删除记录,如果该数据超过了时间限制。

这是代码-

CREATE FUNCTION delete_old_rows() RETURNS trigger
LANGUAGE plpgsql
AS $$
DECLARE
  row_count int;
BEGIN
  DELETE FROM tablename1 WHERE timestamp < NOW() - INTERVAL '1 day';
  IF found THEN
    GET DIAGNOSTICS row_count = ROW_COUNT;
    RAISE NOTICE 'DELETEd % row(s) FROM tablename1', row_count;
  END IF;
  RETURN NULL;
END;
$$;

我收到以下错误- 错误:“CREATE”处或附近的语法错误 第 5 行:AS $BODY$CREATE FUNCTION delete_old_rows() RETURNS 触发器。

【问题讨论】:

  • 那是perfectly valid - 您使用哪个工具来运行它?你的确切 Postgres 版本是什么(select version(); 会告诉你)
  • 11.5版本...
  • 您应该使用不同的客户端,该客户端不会在美元引号分号处拆分 SQL 字符串。
  • 我用的是 PGadmin4 ,你能解释一下吗?
  • 您可能有一些不可见的字符导致了这种情况。将其复制并粘贴到notepad++之类的文本编辑器中,将其设置为显示所有字符,然后查看是否有任何可疑之处。尤其是当您从某些网页或带有格式化字符的文档中复制/粘贴任何部分时,可能会发生这种情况。

标签: postgresql


【解决方案1】:

虽然触发器函数本身看起来你可能想好好看看

返回 NULL ;

因为您没有发布实际的触发器。来自Docs

BEFORE 触发的行级触发器可以返回 null 来表示触发器 经理跳过该行的其余操作(即, 随后的触发器不会被触发,并且 INSERT/UPDATE/DELETE 会 此行不会发生)。如果返回非空值,则 操作以该行值继续。返回行值 与 NEW 的原始值不同会改变将是的行 插入或更新。因此,如果触发函数想要 在不改变行值的情况下触发动作正常成功, 必须返回 NEW(或与其相等的值)。将行更改为 被存储,可以直接在 NEW 和 返回修改后的 NEW,或建立一个完整的新记录/行 返回。在 DELETE 前触发的情况下,返回值 没有直接影响,但必须为非空才能允许触发 进行的行动。请注意,在 DELETE 触发器中 NEW 为空,因此 返回通常是不明智的。 DELETE 中的惯用语 triggers 是返回 OLD。

【讨论】:

  • “DELETE 触发器中通常的习惯用法是返回 OLD”。如此基本的更改“返回 Null”到“返回旧”
  • 我的评论/答案解决了 return null 语句 - 没有别的。看看其他的cmets。尤其是 404 的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
相关资源
最近更新 更多