После триггера обновления для замены пустой строки значением NULL обновляются все данные в этом столбце до NULL. - PullRequest
1 голос
/ 21 февраля 2020

Я хочу обновить запись только определенного пользователя. Но триггер обновления срабатывает для всех пользователей.

CREATE OR REPLACE FUNCTION replace_empty_username_with_null() RETURNS TRIGGER
    LANGUAGE plpgsql AS
BEGIN
    UPDATE user_temp
    SET username=null
    WHERE NEW.id = OLD.id and NEW.username = '';

    RETURN NEW;
END
CREATE TRIGGER replace_empty_username
    AFTER UPDATE OF username ON user_temp
    FOR EACH ROW
    WHEN (NEW.username = '' AND OLD.id = NEW.id)
EXECUTE PROCEDURE replace_empty_username_with_null();

1 Ответ

0 голосов
/ 21 февраля 2020

Выражение NEW.id = OLD.id имеет смысл в предложении WHEN триггера ( "ID не изменился и не является нулевым" ). Но нет смысла в теле триггера функция , где он сгорает до TRUE. Кроме того, чтобы повлиять только на строку, которая обновляется, просто используйте триггер BEFORE вместо:

CREATE OR REPLACE FUNCTION replace_empty_username_with_null()
  RETURNS TRIGGER LANGUAGE plpgsql AS
$func$
BEGIN
   NEW.username = null;  -- !
   RETURN NEW;
END
$func$

CREATE TRIGGER replace_empty_username
BEFORE UPDATE OF username ON user_temp -- !
FOR EACH ROW
WHEN (NEW.username = '' AND OLD.id = NEW.id)
EXECUTE PROCEDURE replace_empty_username_with_null();

Связанный:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...