我必须创建一个触发器来更新有产品的数据库。产品具有到期日期,在插入或更新产品之前,我必须检查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();
当满足要检查的条件并且您希望发生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。>>
正如我在this article中所解释的,实现此目标的最简单方法是通过CHECK
约束,这是SQL标准功能。