Thread: TRIGGER Question
All; I want to create a trigger function that can set a value for a column if the column was not specified in the update statement. I have this so far; CREATE OR REPLACE FUNCTION set_last_updated_by() returns trigger AS $$ BEGIN RAISE NOTICE '[%] [%]', NEW.last_updated_by, OLD.last_updated_by; IF (TG_OP = 'INSERT') THEN IF NEW.last_updated_by IS NULL THEN NEW.last_updated_by='BACK_OFFICE'; RAISE NOTICE 'SETTING NEW.last_updated_by to BACK_OFFICE for INSERT'; END IF; ELSIF (TG_OP = 'UPDATE') THEN IF NEW.last_updated_by IS NULL THEN NEW.last_updated_by='BACK_OFFICE'; RAISE NOTICE 'SETTING NEW.last_updated_by to BACK_OFFICE for update'; END IF; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; DROP TRIGGER user_last_update_by_trg ON users; CREATE TRIGGER user_last_update_by_trg BEFORE INSERT OR UPDATE ON users FOR EACH ROW EXECUTE FUNCTION set_last_updated_by(); However if the row to be updated already has a value for last_updated_by even if the last_updated_by column is not specified in the update statement, then the "IF NEW.last_updated_by IS NULL THEN" is never fired.. Thoughts? Thanks in advance
On Thu, May 27, 2021 at 9:31 PM sbob <sbob@quadratum-braccas.com> wrote:
I want to create a trigger function that can set a value for a column if
the column was not specified in the update statement.
[...]
However if the row to be updated already has a value for last_updated_by
even if the last_updated_by column is not specified in the update
statement, then the "IF NEW.last_updated_by IS NULL THEN" is never fired..
Thoughts?
Not specifying a column in an update is shorthand for "leave the column unchanged". There isn't a way for you to make it mean something else - you only get to see that OLD and NEW are equal.
Thus, your requirement is not possible as described. And if you have to allow for arbitrary update commands your requirement is going to be impossible to enforce. Otherwise, you could make all updates go through procedures/functions and enforce the requirement there.
David J.