Thread: TRIGGER Question

TRIGGER Question

From
sbob
Date:
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






Re: TRIGGER Question

From
"David G. Johnston"
Date:
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.