用于在PostgreSQL上进行INSERT或UPDATE之前检查给定值的触发器

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

我必须创建一个触发器来更新有产品的数据库。产品具有到期日期,在插入或更新产品之前,我必须检查expirationDate是否优于当前时间戳。如果是这样,我必须定期进行插入/更新(这是我遇到的问题)。如果没有,我只是忽略它。

这是我编写的代码。

CREATE FUNCTION product_expiration_date()
RETURNS trigger AS $BODY$

BEGIN
IF new.expirationDate > CURRENT_TIMESTAMP THEN
    INSERT INTO Product VALUES (new).*; 
END IF;
RETURN NULL;
END;
$BODY$
LANGUAGE 'plpgsql';

CREATE TRIGGER verify_expiration_date BEFORE INSERT OR UPDATE ON Product 
FOR EACH ROW EXECUTE PROCEDURE product_expiration_date();
sql postgresql triggers plpgsql
2个回答
6
投票

当满足要检查的条件并且您希望发生INSERT / UPDATE时,您的触发函数应该返回NEW,否则NULL跳过该操作,或者更好的是,引发带有特定错误消息的异常。

它不能自行执行被调用的INSERT,这将由SQL引擎使用NEW中的值完成。

跳过操作的代码:

IF new.expirationDate > CURRENT_TIMESTAMP THEN
  RETURN NEW;
ELSE 
  RETURN NULL;
END IF;

或有例外:

IF new.expirationDate > CURRENT_TIMESTAMP THEN
  RETURN NEW;
ELSE 
  RAISE EXCEPTION 'Invalid expiration date';
END IF;

有关更多信息,请参见文档中的Overview of Trigger Behavior。>>


0
投票

正如我在this article中所解释的,实现此目标的最简单方法是通过CHECK约束,这是SQL标准功能。

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