I have to create a trigger to update a database where there are products. Products have an expiration date and before inserting or updating a product I must check if the expirationDate is superior to the current timestamp. If it is I must do the insert/update regularly (this is what I have problems with). If not I just simply ignore it.
Here’s the code that I have written.
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();
Advertisement
Answer
Your trigger function should return NEW
when the condition to check is satisfied and you want the INSERT/UPDATE to happen, otherwise NULL
to skip the operation, or better, raise an exception with a specific error message.
It must not execute itself the INSERT it was called for, this will be done by the SQL engine with the values in NEW
.
Code to skip the operation:
IF new.expirationDate > CURRENT_TIMESTAMP THEN RETURN NEW; ELSE RETURN NULL; END IF;
Or with an exception:
IF new.expirationDate > CURRENT_TIMESTAMP THEN RETURN NEW; ELSE RAISE EXCEPTION 'Invalid expiration date'; END IF;
See Overview of Trigger Behavior in the doc for more.