Как определить, влияет ли на поле / столбец инструкция UPDATE - PullRequest
3 голосов
/ 06 мая 2011

Привет всем и спасибо за ваши ответы и комментарии.

У меня есть таблица с несколькими полями, среди которых version, last_modified и modified_by

I 'm запись триггера в:

  • увеличение version на 1 после каждого / любого обновления,
  • установка last_modified на текущую метку времени,
  • установкаидентификатор пользователя, который внес последние изменения в modified_by, и
  • не позволяют программисту игнорировать / забыть установить modified_by = userid в операторе UPDATE, вызвав сигнал (в таком случае).

Как мне этого добиться?

Я пытался проверить, если isnull(NEW.modified_by), но потом понял, что NEW.modified_by принимает то же значение, что и OLD.modified_by, если на него не влияют.Кроме того, проверка того, что NEW.modified_by равно OLD.modified_by, не совсем подходит, так как это может быть пользователь, модифицирующий запись, ранее измененную им самим.

Есть ли способ определить, какие поля где затронут оператор UPDATE?Или если было затронуто определенное поле (modified_by)?

Ответы [ 3 ]

3 голосов
/ 17 февраля 2013

У меня была похожая проблема.У меня есть таблица со столбцом tinyint с именем isDirty, и я хотел установить ее в 1 при обновлении строки и очистить ее до 0, когда строка была «очищена».

Проблема в том, что комбинацияNEW и OLD со значениями 0 и 1 не дали мне достаточно значений, чтобы решить мою проблему.Поэтому вместо этого я создал «правило», согласно которому при обновлении столбца до значения 100 ему было присвоено чистое значение «0», а все остальное - «1».Причина, по которой это работает, заключается в том, что в этом столбце будет только одно из 2 значений, 0 или 1, поэтому вы можете использовать 100 (или любое другое значение по вашему выбору) в качестве «флага», который указывает, что он чистый.

Я знаю, что звучит немного задом наперед, чтобы установить ненулевое значение, чтобы вернуться к 0, но это направление, которое я выбрал, и это работает.Вот как выглядит этот триггер:

CREATE TRIGGER calls_update BEFORE UPDATE ON `calls`
    FOR EACH ROW
    BEGIN
        IF ( NEW.isDirty = 100 ) THEN
            SET NEW.isDirty = 0;
    ELSE
            SET NEW.isDirty = 1;
        END IF;
    END
$$
3 голосов
/ 06 мая 2011

Я не могу найти ничего, что позволило бы вам проверить поступающую информацию, чтобы увидеть, какие поля затрагиваются. Хотя я знаю, что вы пытаетесь остановить эту проблему на уровне триггера, было бы разумно потребовать, чтобы все записи в таблицы проходили через хранимую процедуру. Таким образом, вам может потребоваться поле пользователя.

Если это не возможно, думаю, вам может понадобиться хитрость. Например, вы можете потребовать, чтобы user_id был записан в два поля (для этого создайте дополнительный столбец, который будет пустым). Затем сравните user_id в фиктивном столбце с тем, который вы обновляете. Как только вы поймете, нужно ли вам изменять user_id или нет, снова очистите пустую колонку. Это не красиво, но это сделало бы работу.

0 голосов
/ 06 мая 2011

Насколько я знаю, ваш единственный вариант - проверять НОВОЕ значение каждого столбца со СТАРЫМ.

SET `ColumnAChanged` = NEW.ColumnA <=> OLD.ColumnA;
SET `ColumnBChanged` = NEW.ColumnB <=> OLD.ColumnB;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...