За последние 24 часа нас посетил 22551 программист и 1015 роботов. Сейчас ищут 718 программистов ...

Отслеживание изменений в таблице

Тема в разделе "MySQL", создана пользователем Moor, 29 июл 2021.

Метки:
  1. Moor

    Moor Новичок

    С нами с:
    1 мар 2020
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Latvia
    Пожалуйста, подскажите, есть ли в PHP или в мускуле какая-то готовая / встроенная функция отслеживания изменений в определенной колонке таблицы?

    Есть база товаров — названия, цены, etc. Данные обновляются в таблице постоянно, отслеживать по дате изменения не вариант. Нужно вызывать определенный скрипт, если значение в поределенных колонках изменено. Нагуглил только mysql_affected_rows, но это не вариант, там в результате возвращает, что изменились все строки. Понимаю про проверку вроде
    Код (Text):
    1. новое_значение != старое_значение
    , но она будет занимать довольно значительное время, поэтому решил сначала спросить совета опытных.
     
  2. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Ведите в отдельной таблице журнал.
    ID;UID;дата;изменяемое поле;старое значение;новое значение;прочее
     
  3. Moor

    Moor Новичок

    С нами с:
    1 мар 2020
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Latvia
    Ну то есть ничего готового нет. Тогда нет смысла городить журнал, все равно придется прикручивать проверку на изменение. Жаль, жаль.
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    вообще непонятная постановка вопроса.

    что значит изменение столбца? В БД есть таблицы, строки и поля.
    Допустим вы столбцами называете конкретное поле в таблице .... что в вашем понимании - отслеживание изменений? ведь строк много....

    вы лучше скажите по человесески - какая задача стоит и вам способ подскажут, а то вы думаете что это вот так - и спрашиваете совсем другое.

    P.S. подозреваю что вопрос идет об отслеживании операции update, и вам можно использовать триггеры в БД
     
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Почему? Только дата без времени или что?

    В общем, если при апдэйтах время не используется/не меняется, тогда триггеры, как выше написали!
    --- Добавлено ---
    Ну, или добавить поле с временем/обновлять его.
     
  6. Moor

    Moor Новичок

    С нами с:
    1 мар 2020
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Latvia
    ОК, согласен, поясняю.
    В таблице хранятся данные о товарах. UPDATE происходит не реже раза в минуту. Мне нужно вызывать некую функцию только в том случае, если у товара изменилось поле "название", "цена", "цена распродажи" или "складской статус". То есть если при обновлении значение поля != старому значению поля.
     
  7. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    https://habr.com/ru/post/37693/
     
  8. Moor

    Moor Новичок

    С нами с:
    1 мар 2020
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Latvia
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Эта функция на PHP? Добавь в систему "события" и "слушателей", то есть некий аналог триггеров в базе, только не в базе. ))) https://refactoring.guru/ru/design-patterns/observer

    Ещё есть паттерн Event Sourcing, где все действия в т.ч. изменение товаров рассматриваются как поток событий. Что-то вроде лога. В этот поток события только добавляются, они не подлежат изменению. А дополнительно к этому потоку могут быть "проекции", которые строят данные на базе событий. Например строится запись в products. При таком подходе потенциально возможно составить картину на любой момент времени, заново создать товары, если понадобится. https://habr.com/ru/post/178259/