Скопируйте Tuple ИЛИ сохраните Id of Tuple в другой таблице (ProductLogs), когда какое-либо поле обновляется в определенной таблице (продукты) - PullRequest
0 голосов
/ 19 января 2019

Я не знаю, какое решение я нахожу, будет ли оно возможным или нет.

Постановка проблемы: В БД есть таблица с именем Продукты Мне нужно отслеживать продукты с обновленной / измененной ценой, но я не хочу использовать столбецified_date, потому что он не существует.

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

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Как уже упоминалось в StepUp, классический способ сделать это - использовать AFTER TRIGGER.Пример решения будет запускаться только с UPDATE.В вашем случае вы хотели бы также добавить триггеры для INSERT и DELETE или адаптировать этот один триггер для обработки этих трех типов событий.

Обратите внимание, что использование триггера может повлиять на @@ ROWCOUNT, поэтому можетвлияет на функциональность.

В связи с этим, я думаю, что последние версии SQL Server имеют альтернативные механизмы.

0 голосов
/ 19 января 2019

Попробуйте использовать триггер после UPDATE:

    CREATE TRIGGER ModDate
    ON YourTable
    AFTER UPDATE
AS
BEGIN        
    INSERT INTO dbo.LogTable(DateModified)
    VALUES (GETDATE());
    PRINT 'New Block Date Added';
END 

ОБНОВЛЕНИЕ:

Когда триггер работает, под капотом есть две таблицы:

  • "INSERTED"
  • "DELETED"

Данные в этих виртуальных таблицах зависят от того, что вы делаете:

  • Операция вставки: при вставке записи виртуальная таблица «вставлена» содержит вновь вставленную запись, где виртуальная таблица «УДАЛЕНО» остается пустой
  • Операция обновления: при обновлении записи сначала старая запись будетбыть помещен в виртуальную таблицу «DELETED», а обновленная запись удерживается виртуальной таблицей «INSERTED».

    Это означает, что вы можете получить старое значение из «DELETED» и текущее значение обновления через «INSERTED»."виртуальный стол.Вы можете запросить их как:

    -- To get the old record value
    SELECT * FROM DELETED
    
    -- To get the updated value
    SELECT * FROM INSERTED
    
  • Операция удаления: при попытке удалить какую-либо конкретную запись удаленная запись будет вставлена ​​в виртуальную таблицу «УДАЛЕНО».

Итак, ваш триггер должен выглядеть так:

CREATE TRIGGER ModDate
    ON YourTable
    AFTER UPDATE
AS
BEGIN        
    INSERT INTO dbo.LogTable(DateModified, IdUpdatedRow)
    SELECT GETDATE(), INSERTED.YourIdOfUpdatedRow;
    PRINT 'New Block Date Added';
END 
...